CREATE TRIGGER

Определяет новый триггер. Пользовательские триггеры не поддерживаются в Database.

Обзор

CREATE TRIGGER <name> {BEFORE | AFTER} {<event> [OR ...]}
       ON <table> [ FOR [EACH] {ROW | STATEMENT} ]
       EXECUTE PROCEDURE <funcname> ( <arguments> )

Описание

CREATE TRIGGER создаёт новый триггер. Триггер будет связан с указанной таблицей и будет запускать указанную функцию при наступлении определённых событий. Если для одного и того же события определено несколько триггеров одного типа, они будут выполняться в алфавитном порядке по имени.

Важно: из-за распределённой природы системы баз данных использование триггеров для данных крайне ограничено в Database. Функция, используемая в триггере, должна быть IMMUTABLE (неизменяемой), то есть она не может использовать информацию, отсутствующую непосредственно в списке её аргументов. Также указанная в триггере функция не может выполнять никакие SQL-запросы и изменять распределённые объекты базы данных никаким образом. Поскольку триггеры чаще всего используются для изменения таблиц (например, обновления других строк при обновлении текущей строки), данные ограничения делают применение триггеров в Database практически бесполезным. По этой причине Database не поддерживает использование пользовательских триггеров. Триггеры нельзя использовать с таблицами с режимом добавления записей (append-optimized). В Database поддерживаются Event Triggers (триггеры событий), которые перехватывают только DDL-события. Дополнительную информацию см. в документации PostgreSQL по Event Triggers.

SELECT не изменяет строки, поэтому создание SELECT-триггеров невозможно. В таких случаях более уместно использовать правила или представления.

Параметры

  • name
    • Имя нового триггера. Должно отличаться от имён всех остальных триггеров для данной таблицы.
  • BEFORE AFTER
    • Определяет, будет ли функция вызываться до или после события. Если триггер срабатывает до события, он может пропустить операцию для текущей строки или изменить вставляемую строку (только для операций INSERT и UPDATE). Если триггер срабатывает после события, все изменения, включая последнюю вставку, обновление или удаление, будут видны триггеру.
  • event
    • Указывает событие, которое активирует триггер (INSERT, UPDATE или DELETE). Несколько событий можно указать через OR.
  • table
    • Имя таблицы (при необходимости — с указанием схемы), для которой создаётся триггер.
  • FOR EACH ROW
  • FOR EACH STATEMENT
    • Определяет, должна ли процедура триггера вызываться один раз для каждой затронутой строки или один раз на весь SQL-оператор. Если ни один из вариантов не указан, по умолчанию используется FOR EACH STATEMENT. Триггер, помеченный как FOR EACH ROW, вызывается один раз для каждой строки, изменённой операцией. Напротив, триггер, помеченный как FOR EACH STATEMENT, выполняется только один раз для любой операции, независимо от количества затронутых строк.
  • funcname
    • Пользовательская функция, объявленная как IMMUTABLE, без аргументов и возвращающая тип trigger, которая выполняется при срабатывании триггера. Эта функция не должна выполнять SQL-запросы и изменять базу данных никаким способом.
  • 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 в Database реализует лишь подмножество стандарта SQL. Следующие возможности в настоящее время отсутствуют:

Database накладывает строгие ограничения на функцию, вызываемую триггером, что сильно ограничивает практическое применение триггеров. По этой причине триггеры официально не поддерживаются в Database. SQL позволяет триггерам срабатывать при обновлении конкретных столбцов (например, AFTER UPDATE OF col1, col2). SQL позволяет определять псевдонимы для старых ('old') и новых ('new') строк или таблиц для использования в действии триггера (например, CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...). Поскольку Database позволяет писать процедуры триггеров на различных пользовательских языках, доступ к данным осуществляется специфичным для языка способом. Database разрешает выполнение только пользовательской функции в качестве действия триггера. Стандарт SQL допускает выполнение ряда других SQL-команд, например CREATE TABLE, в качестве действия триггера. Это ограничение легко обходится путём создания пользовательской функции, выполняющей нужные команды. Согласно стандарту SQL, несколько триггеров должны срабатывать в порядке их создания. Database использует порядок по имени, который был признан более удобным. Стандарт SQL предусматривает, что триггеры BEFORE DELETE, установленные на каскадное удаление, срабатывают после завершения каскадного DELETE. В Database поведение таково, что BEFORE DELETE всегда срабатывает до операции удаления, даже если она каскадная. Это считается более согласованным подходом. Возможность указания нескольких действий для одного триггера с помощью OR является расширением Database по отношению к стандарту SQL.

Смотрите также

CREATE FUNCTION, ALTER TRIGGER, DROP TRIGGER, CREATE RULE