Найти в Дзене
programmer's notes (python and more)

Реляционные базы данных и язык SQL. Понятие триггера. DML-триггеры на языке PLpgSQL

Доброго здоровья читателям моего канала 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.

Триггеры это прекрасный способ остановить вас от безрассудных поступков
Триггеры это прекрасный способ остановить вас от безрассудных поступков