43.6. Триггеры PL/Perl#
43.6. Триггеры PL/Perl
PL/Perl может использоваться для написания триггерных функций. В триггерной функции хеш-ссылка $_TD содержит информацию о текущем событии триггера. $_TD - это глобальная переменная, которая получает отдельное локальное значение для каждого вызова триггера. Поля хеш-ссылки $_TD следующие:
$_TD->{new}{foo}NEWзначение столбцаfoo$_TD->{old}{foo}OLDзначение столбца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();