Документация по 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 |