Доброго здоровья читателям моего канала programmer's notes. Поддерживаем мой канал.
В продолжении статей о языке PLpgSQL в PostgreSQL. Предыдущая статья этой серии здесь.
DML-триггеры в PostgreSQL
Приступим теперь к рассмотрению DML-триггеров. В предыдущей строки мы уже говорили, какие бывают DML-триггеры, так что остаётся только сослаться на неё.
Как и в случае триггера DDL в начале создаётся функция, которая будет вызываться триггером DML. Функция представлена ниже. Она будет обрабатывать добавление строк к таблице ocenki, отбрасывая неправильные значения.
create or replace function provoc()
returns trigger
as
$$
begin
if NEW.ocenka is NULL then
raise exception 'Недопустимое значение оценки NULL';
end if;
if NEW.ocenka < 2 or NEW.ocenka > 5 then
raise exception 'Оценка может принимать значения 2, 3, 4, 5';
end if;
insert into log (who, dt) values (current_user, current_timestamp);
return NULL;
end;
$$
language 'plpgsql';
Пояснения к функции dml-триггера.
1. NEW это добавляемая строка. Соответственно NEW.ocenka — это значение оценки. Если используется операция delete или update, то доступ к старой строке через OLD. Надо иметь в виду, что команда update рассматривается как две команды delete и insert, поэтому в триггере, который обрабатывает udate есть строка OLD и есть строка NEW.
2. Триггер отсекает неприемлемые значения оценок. Команда raise exception вызывает исключение и отменяет действие.
3. Если значение оценки не противоречит каким-либо требованиям, то данные о том, кто добавлял и когда помещается в таблицу log.
Для того, чтобы триггер заработал надо осуществить ещё одну команду.
create trigger dml before insert on ocenki
for each row execute procedure provoc();
В команде мы указываем, что
1. Триггер сработает до выполнения команды (before).
2. Он привязан к таблице ocenki и к команде insert.
3. Важно, что триггер будет срабатывать при добавлении каждой строки (each row).
Основное назначение DML-триггеров это журналирование и отмену тех или иных действий с конкретной таблицей. Триггер, т.о. это ещё одно средство поддержание целостности реляционной базы данных.
Следующая статья это серии здесь
Пока всё!
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.