Язык 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"; # пропуск команды INSERT/UPDATE
} elsif ($_TD->{new}{v} ne "immortal") {
$_TD->{new}{v} .= "(modified by trigger)";
return "MODIFY"; # изменение строки и выполнение команды INSERT/UPDATE
} else {
return; # выполнение команды INSERT/UPDATE
}
$$ LANGUAGE plperl;
CREATE TRIGGER test_valid_id_trig
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW EXECUTE FUNCTION valid_id();