Триггеры PL/Perl
Эта страница переведена при помощи нейросети GigaChat.
PL/Perl может использоваться для написания функций триггеров. В функции триггера хеш-ссылка $_TD
содержит информацию о текущем событии триггера. $_TD
является глобальной переменной, которая получает отдельное локальное значение для каждого вызова триггера. Поля хеш-ссылки $_TD
следующие:
$_TD->{new}{foo}
Новое значение столбца foo
$_TD->{old}{foo}
Старое значение столбца foo
.
$_TD->{name}
Имя триггера, который вызывается.
$_TD->{event}
Событие триггера: INSERT
, UPDATE
, DELETE
, TRUNCATE
, или UNKNOWN
.
$_TD->{when}
Когда был вызван триггер: BEFORE
, AFTER
, INSTEAD OF
, или UNKNOWN
.
$_TD->{level}
Уровень триггера: ROW
, STATEMENT
или UNKNOWN
.
$_TD->{relid}
OID таблицы, для которой сработал триггер.
$_TD->{table_name}
Имя таблицы, для которой сработал триггер.
$_TD->{relname}
Имя таблицы, на которой сработал триггер. Это устарело и может быть удалено в будущем релизе. Вместо этого используйте $_TD->{table_name}
.
$_TD->{table_schema}
Имя схемы, в которой находится таблица, на которую сработал триггер.
$_TD->{argc}
Количество аргументов функции триггера.
@{$_TD->{args}}
Аргументы функции триггера. Не существует, если $_TD->{argc}
равно 0.
Триггеры уровня строки могут возвращать одно из следующих значений:
return;
Выполнить операцию.
"SKIP"
Не выполнять операцию.
"MODIFY"
Указывает, что строка NEW
была изменена функцией триггера.
Пример функции триггера, иллюстрирующий некоторые из вышеперечисленных моментов:
CREATE TABLE test (
i int,
v varchar
);
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
return "SKIP"; # skip INSERT/UPDATE command
} elsif ($_TD->{new}{v} ne "immortal") {
$_TD->{new}{v} .= "(modified by trigger)";
return "MODIFY"; # modify row and execute INSERT/UPDATE command
} else {
return; # execute INSERT/UPDATE command
}
$$ LANGUAGE plperl;
CREATE TRIGGER test_valid_id_trig
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW EXECUTE FUNCTION valid_id();