CREATE TRIGGER
Определяет новый триггер. Пользовательские триггеры не поддерживаются в Greengage DB.
Синтаксис
CREATE TRIGGER <name> {BEFORE | AFTER} {<event> [OR ...]}
ON <table> [ FOR [EACH] {ROW | STATEMENT} ]
EXECUTE PROCEDURE <funcname> ( <arguments> )
Описание
CREATE TRIGGER создает новый триггер.
Триггер будет связан с указанной таблицей и будет выполнять указанную функцию при наступлении определенных событий.
Если для одного и того же события определено несколько триггеров одного типа, они будут срабатывать в алфавитном порядке по имени.
Из-за распределенного характера Greengage DB использование триггеров для данных в этой СУБД сильно ограничено.
Функция, используемая в триггере, должна быть IMMUTABLE, то есть не может использовать информацию, не представленную непосредственно в ее списке аргументов.
Функция, указанная в триггере, также не может выполнять SQL-запросы или каким-либо образом изменять объекты распределенной базы данных.
Учитывая, что триггеры чаще всего используются для изменения таблиц (например, обновить другие строки при обновлении данной строки), эти ограничения делают практическое применение триггеров в Greengage DB крайне ограниченным.
По этой причине Greengage DB не полностью поддерживает использование пользовательских триггеров.
Триггеры не могут использоваться на append-optimized таблицах.
Событийные триггеры (event trigger), которые перехватывают только DDL-события, поддерживаются в Greengage DB.
Дополнительную информацию см. в разделе Event Triggers в документации PostgreSQL.
SELECT не изменяет строки, поэтому создать триггер на SELECT невозможно.
Для таких случаев более подходящими являются правила (rule) и представления (view).
Если запрос вызывает триггер, он может быть запланирован только планировщиком PostgreSQL.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя нового триггера. Оно должно отличаться от имени любого другого триггера для той же таблицы |
BEFORE AFTER |
Определяет, вызывается ли функция до или после события.
Если триггер срабатывает до события, он может пропустить операцию для текущей строки или изменить вставляемую строку (только для операций |
event |
Указывает событие, при котором срабатывает триггер ( |
table |
Имя таблицы (при необходимости с указанием схемы), для которой создается триггер |
FOR EACH ROW | FOR EACH STATEMENT |
Определяет, должна ли процедура триггера вызываться один раз для каждой строки, затронутой событием триггера, или один раз для всего SQL-оператора.
Если не указано ни то, ни другое, по умолчанию используется |
funcname |
Пользовательская функция, объявленная как |
arguments |
Необязательный список аргументов, разделенных запятыми, передаваемых функции при срабатывании триггера. Аргументы представляют собой строковые литеральные константы. Здесь также можно указать простые имена и числовые константы, но все они будут преобразованы в строки. Обратитесь к описанию языка реализации триггерной функции, чтобы узнать, как получить доступ к аргументам триггера внутри функции; этот способ может отличаться от передачи обычных аргументов функции |
Примечания
Для создания триггера на таблице пользователь должен иметь привилегию TRIGGER на эту таблицу.
Примеры
Создать функцию триггера и затем сам триггер:
CREATE FUNCTION sendmail()
RETURNS trigger
AS
'$GPHOME/lib/emailtrig.so'
LANGUAGE C IMMUTABLE;
CREATE TRIGGER t_sendmail AFTER INSERT OR UPDATE OR DELETE
ON mytable FOR EACH STATEMENT EXECUTE PROCEDURE sendmail();
Совместимость
Оператор CREATE TRIGGER в Greengage DB реализует подмножество стандарта SQL.
В настоящее время отсутствует следующая функциональность:
-
Greengage DB имеет строгие ограничения на функцию, вызываемую триггером, что делает использование триггеров в Greengage DB крайне ограниченным. По этой причине триггеры официально не поддерживаются в Greengage DB.
-
SQL позволяет срабатывание триггеров при обновлении определенных столбцов (например,
AFTER UPDATE OF col1, col2). -
SQL поддерживает псевдонимы для "старых" и "новых" строк или таблиц для использования в определении действия триггера (например,
CREATE TRIGGER … ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername …). Поскольку Greengage DB позволяет писать процедуры триггеров на различных пользовательских языках, доступ к данным обеспечивается способом, специфичным для конкретного языка. -
Greengage DB допускает выполнение только пользовательской функции в качестве действия триггера. Стандарт допускает выполнение ряда других SQL-команд, таких как
CREATE TABLE, в качестве действия триггера. Это ограничение легко обойти, создав пользовательскую функцию, выполняющую нужные команды. -
SQL предписывает, что несколько триггеров должны срабатывать в порядке их создания. Greengage DB использует алфавитный порядок по имени, что было признано более удобным.
-
SQL предписывает, что триггеры
BEFORE DELETEпри каскадном удалении срабатывают после завершения каскадногоDELETE. В Greengage DB триггерBEFORE DELETEвсегда срабатывает до действия удаления, даже каскадного. Такое поведение считается более последовательным. -
Возможность указать несколько действий для одного триггера с помощью
ORявляется расширением Greengage DB по отношению к стандарту SQL.