| Документация по PostgreSQL 9.4.1 | |||
|---|---|---|---|
| Пред. | Уровень выше | Глава 41. PL/Tcl — процедурный язык Tcl | След. |
41.6. Процедуры триггеров на PL/Tcl
На PL/Tcl можно написать триггерные процедуры. PostgreSQL требует, чтобы процедура, которая будет вызываться как триггерная, была объявлена как функция без аргументов и возвращала тип trigger.
Информация от менеджера триггеров передаётся в тело процедуры в следующих переменных:
- $TG_name
Имя триггера из оператора CREATE TRIGGER.
- $TG_relid
Идентификатор объекта таблицы, для которой будет вызываться триггерная процедура.
- $TG_table_name
Имя таблицы, для которой будет вызываться триггерная процедура.
- $TG_table_schema
Схема таблицы, для которой будет вызываться триггерная процедура.
- $TG_relatts
Список языка Tcl, содержащий имена колонок таблицы. В начало списка добавлен пустой элемент, поэтому при поиске в этом списке имени колонки с помощью стандартной в Tcl команды
lsearchбудет возвращён номер элемента, начиная с 1, так же, как нумеруются колонки в PostgreSQL. (В позициях удалённых колонок также содержатся пустые элементы, так что нумерация следующих за ними атрибутов не нарушается.)- $TG_when
Строка BEFORE, AFTER или INSTEAD OF, в зависимости от типа события триггера.
- $TG_level
Строка ROW или STATEMENT, в зависимости от уровня события триггера.
- $TG_op
Строка INSERT, UPDATE, DELETE или TRUNCATE, в зависимости от действия события триггера.
- $NEW
Ассоциативный массив, содержащий значения новой строки таблицы для действий INSERT или UPDATE, либо пустой массив для DELETE. Индексами в массиве являются имена колонок. Колонки со значениями NULL в нём отсутствуют. Для триггеров уровня оператора этот массив не определяется.
- $OLD
Ассоциативный массив, содержащий значения старой строки таблицы для действий UPDATE или DELETE, либо пустой массив для INSERT. Индексами в массиве являются имена колонок. Колонки со значениями NULL в нём отсутствуют. Для триггеров уровня оператора этот массив не определяется.
- $args
Список на языке Tcl аргументов процедуры, заданных в операторе CREATE TRIGGER. Эти аргументы также доступны под обозначениями $1 ... $n в теле процедуры.
Возвращаемым значением триггерной процедуры может быть строка OK или SKIP, либо список, в виде, возвращаемом командой языка Tcl array get. Если возвращается значение OK, операция (INSERT/UPDATE/DELETE), которая привела к срабатыванию триггера, выполняется нормально. Значение SKIP указывает менеджеру триггеров просто пропустить эту операцию с текущей строкой данных. Если возвращается список, через него PL/Tcl передаёт менеджеру триггеров изменённую строку. Это имеет смысл только для триггеров уровня строки с порядком BEFORE команд INSERT и UPDATE, в которых вместо заданной в $NEW будет записываться изменённая строка; либо с порядком INSTEAD OF команд INSERT или UPDATE, в которых возвращаемая строка задействована в INSERT RETURNING или UPDATE RETURNING. Для других типов триггеров возвращаемое значение игнорируется.
Следующий небольшой пример показывает триггерную процедуру, которая ведёт в таблице целочисленный счётчик числа изменений, выполненных в строке. Для новых строк счётчик инициализируется нулевым значением, а затем увеличивается на единицу при каждом изменении.
CREATE FUNCTION trigfunc_modcount() RETURNS trigger AS $$
switch $TG_op {
INSERT {
set NEW($1) 0
}
UPDATE {
set NEW($1) $OLD($1)
incr NEW($1)
}
default {
return OK
}
}
return [array get NEW]
$$ LANGUAGE pltcl;
CREATE TABLE mytab (num integer, description text, modcnt integer);
CREATE TRIGGER trig_mytab_modcount BEFORE INSERT OR UPDATE ON mytab
FOR EACH ROW EXECUTE PROCEDURE trigfunc_modcount('modcnt');Заметьте, что сама триггерная процедура не знает имени колонки; оно передаётся в аргументах триггера. Это позволяет применять эту триггерную процедуру для различных таблиц.
| Пред. | Начало | След. |
| Обращение к базе данных из PL/Tcl | Уровень выше | Процедуры событийных триггеров в PL/Tcl |