Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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

Определяет, вызывается ли функция до или после события. Если триггер срабатывает до события, он может пропустить операцию для текущей строки или изменить вставляемую строку (только для операций 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 в 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.

См. также