Триггеры 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();