Обзор поведения триггеров событий
Эта страница переведена при помощи нейросети GigaChat.
Триггер события срабатывает всякий раз, когда событие, с которым он связан, происходит в базе данных, для которой он определен. В настоящее время поддерживаются только следующие события: login
, ddl_command_start
, ddl_command_end
, table_rewrite
и sql_drop
. Поддержка дополнительных событий может быть добавлена в будущих выпусках.
Событие login
возникает при входе аутентифицированного пользователя в систему. Любая ошибка в процедуре триггера для данного события может помешать успешному входу в систему. Такие ошибки можно обойти, установив значение параметра event_triggers равным false
либо в строке подключения, либо в конфигурационном файле. Альтернативный способ заключается в перезапуске системы в однопользовательском режиме (так как в этом режиме триггеры событий отключаются). Подробности использования однопользовательского режима см. на странице справки по postgres. Событие login
также будет возникать на серверах резервного копирования. Чтобы предотвратить недоступность серверов, такие триггеры должны избегать записи чего-либо в базу данных при выполнении на сервере резервного копирования. Также рекомендуется избегать длительных запросов в триггерах события login
. Обратите внимание, например, отмена соединения в psql не приведет к отмене выполняющегося триггера login
.
Событие ddl_command_start
происходит непосредственно перед выполнением команды CREATE
, ALTER
, DROP
, SECURITY LABEL
, COMMENT
, GRANT
или REVOKE
. Не выполняется проверка того, существует ли затронутый объект или нет, прежде чем сработает триггер события. Однако, за исключением этого случая, это событие не происходит для команд DDL, нацеленных на общие объекты - базы данных, роли и табличные пространства - или для команд, нацеленных на сами триггеры событий. Механизм триггеров событий не поддерживает эти типы объектов. ddl_command_start
также происходит непосредственно перед выполнением команды SELECT INTO
, поскольку это эквивалентно CREATE TABLE AS
.
Событие ddl_command_end
происходит сразу после выполнения этой же самой группы команд. Чтобы получить более подробную информацию о выполненных операциях DDL, используйте функцию возврата набора pg_event_trigger_ddl_commands()
из кода триггера события ddl_command_end
. Обратите внимание, что триггер срабатывает после того, как действия уже произошли (но до фиксации транзакции), и поэтому системные каталоги могут быть прочитаны как уже измененные.
Событие sql_drop
происходит непосредственно перед событием ddl_command_end
триггера для любой операции, которая удаляет объекты базы данных. Для перечисления объектов, которые были удалены, используйте функцию возврата набора pg_event_trigger_dropped_objects()
из кода триггера события sql_drop
. Обратите внимание, что триггер выполняется после удаления объектов из системных каталогов, так что их больше невозможно найти.
Событие table_rewrite
происходит прямо перед тем, как таблица будет переписана некоторыми действиями команд ALTER TABLE
и ALTER TYPE
. Хотя другие операторы управления доступны для перезаписи таблицы, такими как CLUSTER
и VACUUM
, событие table_rewrite
не вызывается ими.
Триггеры событий (как и другие функции) не могут быть выполнены в прерванной транзакции. Таким образом, если команда DDL завершается с ошибкой, любые связанные триггеры ddl_command_end
не будут выполнены. Напротив, если триггер ddl_command_start
завершается с ошибкой, никакие дальнейшие события-триггеры не сработают, и не будет предпринято никакой попытки выполнить саму команду. Аналогично, если триггер ddl_command_end
завершится ошибкой, действие команды DDL будет отменено, как это происходит при возникновении ошибки внутри транзакции.
Для получения полного списка команд, поддерживаемых механизмом триггера событий, см. раздел «Матрица срабатывания триггеров событий».
Триггеры событий создаются с помощью команды CREATE EVENT TRIGGER. Чтобы создать триггер события, необходимо сначала создать функцию с особым типом возврата event_trigger
. Эта функция не должна (и может не) возвращать значение; тип возврата служит лишь сигналом о том, что функция должна быть вызвана в качестве триггера события.
Если для определенного события определено более одного триггера события, они будут срабатывать в алфавитном порядке по имени триггера.
Определение триггера также может указывать условие WHEN
, так что, например, триггер ddl_command_start
может срабатывать только для определенных команд, которые пользователь хочет перехватить. Общее использование таких триггеров заключается в ограничении диапазона операций DDL, которые пользователи могут выполнять.