powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Описание работы с триггерами
12 сообщений из 12, страница 1 из 1
Описание работы с триггерами
    #32184393
Vadichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большая просьба !
Если кто-нить где-нить видел толковое описание работы с триггерами в PostgreSQL (предпочтительно на русском), очень огромное пожалуйста пробросьте URL. Заранее спасибо.
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32184630
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На примитивном уровне примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE TABLE abc(
  id      SERIAL,
  field1 int,
  primary key(id)
);

CREATE OR REPLACE FUNCTION trig_function () RETURNS OPAQUE AS '
BEGIN
-- Если процедура вызывается BEFORE или AFTER INSERT, то данные, которые 
-- передаются в нее, содержатся в структуре NEW
-- NEW.имя_столбца

-- Если процедура вызывается BEFORE или AFTER DELETE, то данные, которые 
-- передаются в нее, содержатся в структуре OLD 
-- OLD.имя_столбца

-- Если процедура вызывается BEFORE или AFTER UPDATE, то данные, которые 
-- передаются в нее, содержатся в структуре OLD
-- OLD.имя_столбца, а данные, которые будут обновлены - в структуре NEW
-- NEW.имя_столбца

END
'
language 'plpgsql';

CREATE TRIGGER tr_bu BEFORE UPDATE ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

CREATE TRIGGER tr_au AFTER UPDATE ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

CREATE TRIGGER tr_db BEFORE DELETE ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

CREATE TRIGGER tr_ad AFTER DELETE ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

CREATE TRIGGER tr_bi BEFORE INSERT ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

CREATE TRIGGER tr_ai  AFTER INSERT ON abc FOR EACH ROW EXECUTE PROCEDURE trig_function ();

...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185395
Vadichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо за уделенное внимание моей проблеме, но на самом деле она у меня глубже чем могло показаться. Я для того и просил описание потому как я в этом новичок и пока мне не ясен механизм работы - триггер - функция.
А точнее можно ли внутри функции использовать select, insert, update других таблиц ? На сколько силен математический апарат в этих функциях и что он умеет ? Я понимаю, что это вопросы по синтаксису языка используемого внутри функций, но если не затруднит ответ на такие вопросы буду очень признателен. Если нет описания вышеупомянутых вещей, то не мог бы кто-нибудь дать простой примерчик, когда внутри функции беруться данные из разных таблиц, сравниваются и, в зависимости от сравнения заносяться/не заносяться в некую следующую таблицу. Зарание огромное спасибо......
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185626
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример того, как на триггерах можно построить гостевую книгу, в которой в статистике пользователя есть количество его сообщений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
CREATE TABLE users(
  id            SERIAL,
  firstname     VARCHAR( 64 ),
  lastname      VARCHAR( 64 ),
  email         VARCHAR( 128 ),
  posts         int NOT NULL DEFAULT  0 ,  -- количество сообщений
 
  primary key(id)
);

CREATE TABLE gusetbook (
   id         SERIAL,
   users_id   int NOT NULL REFERENCES users(id),
   sublect    VARCHAR( 255 ),
   message    TEXT,
   primary key(id)
);

CREATE OR REPLACE FUNCTION set_posts_bi() RETURNS OPAQUE AS'
BEGIN
     UPDATE users SET posts = posts + 1 WHERE id = NEW.users_id;
RETURN NEW;
END;
'
language 'plpgsql';
CREATE TRIGGER gusetbook_bi BEFORE INSERT ON gusetbook FOR EACH ROW EXECUTE PROCEDURE set_posts_bi();

CREATE OR REPLACE FUNCTION set_posts_ad() RETURNS OPAQUE AS'
BEGIN
     UPDATE users SET posts = posts - 1 WHERE id = OLD.users_id;
RETURN NEW;
END;
'
language 'plpgsql';
CREATE TRIGGER gusetbook_ad AFTER DELETE ON gusetbook FOR EACH ROW EXECUTE PROCEDURE set_posts_ad();

...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185629
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В прошлом посте ошибка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION set_posts_ad() RETURNS OPAQUE AS'
BEGIN
     UPDATE users SET posts = posts - 1 WHERE id = OLD.users_id;
RETURN OLD; -- здесь возвращаем OLD
-- Для отката транзакции возвращаем NULL
END;
'
language 'plpgsql';
CREATE TRIGGER gusetbook_ad AFTER DELETE ON gusetbook FOR EACH ROW EXECUTE PROCEDURE set_posts_ad();


...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185691
Vadichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо за этот пример. Но, если не затруднит, не могли бы немного его дополнить. Допустим в таблице users еще существует поле member - флаг, принимающий значение 0 - не зарегистрированный пользователь 1- зарегистрированный. И если пользователь зарегистрирован, то количество его сообщений считается, если не зарегистрирован, то нет.
Может в плане права на жизнь это не очень удачный пример, но интересует в нем следующее: Есть ли в синтаксисе, используемом в функциях аналог if then else ? Можно ли внутри функции результат select-а сравнить с некой величиной и в зависимости от этого сделать update или не делать оного ? Да и есть ли возможность как-нибудь отпарсить данные, таким образом, что бы сравнить часть строки NEW.имя столбца с частью строки полученной в результате select-а из какой-то таблицы и по результату произвести то или иное действие ?
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185738
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ALTER TABLE users ADD COLUMN is_registered BOOL;

CREATE OR REPLACE FUNCTION set_posts_bi() RETURNS OPAQUE AS'
DECLARE
       bool     bRegistered := false;
BEGIN

     SELECT is_registered INTO bRegistered FROM users WHERE id = NEW.users_id;
     IF bRegistered THEN
          UPDATE users SET posts = posts + 1 WHERE id = NEW.users_id;
     ELSE
          RAISE NOTICE ''user is not registered'';
     END IF;

RETURN NEW;
END;
'
language 'plpgsql';

...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185815
Vadichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз огромное спасибо, теперь я смогу чего-нить да придумать. Если опять зайду в тупик, обращусь за помощью. Да, если не секрет, откуда все это узнаеться опытными людьми?
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32185833
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.postgresql.org/docs/pdf/7.3/admin-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/catalogs-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/connections-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/developer-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/programmer-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/reference-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/tutorial-7.3.2-A4.pdf
http://www.postgresql.org/docs/pdf/7.3/user-7.3.2-A4.pdf
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32187883
OdbAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос to Stellar:
А зачем Вы в триггере After Delete возвращаете OLD? Насколько я понимаю, возвращаемое значение актуально только для триггеров Before, где возврат NULL отменяет соответствующее действие, или я не прав?
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32188022
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос to Stellar:
>А зачем Вы в триггере After Delete возвращаете OLD? Насколько я понимаю,
>возвращаемое значение актуально только для триггеров Before, где возврат
>NULL отменяет соответствующее действие, или я не прав?

Любая процедура в PostgreSQL должна возвращать некое значение.
Поэтому можно вернуть и NULL и OLD - разницы никакой.
...
Рейтинг: 0 / 0
Описание работы с триггерами
    #32314073
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу триггер на FOR EACH STATEMENT , а не по записям.
Могу я получить в триггере ТАБЛИЦЫ (deleted, inserted) , а не ЗАПИСИ (NEW, OLD)?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Описание работы с триггерами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]