FirebirdSQL logo
 VIEWPROCEDURE 

Выполнение триггеров на событие базы данных и обработка исключений

Триггеры на события CONNECT и DISCONNECT выполняются в специально созданной для этого транзакции.Если при обработке триггера не было вызвано исключение, то транзакция подтверждается.Не перехваченные исключения откатят транзакцию и:

  • в случае триггера на событие CONNECT соединение разрывается, а исключения возвращается клиенту;

  • для триггера на событие DISCONNECT соединение разрывается, как это и предусмотрено, но исключения не возвращается клиенту.

Триггеры на события CONNECT и DISCONNECT срабатывают также при выполнении оператора сброса сессионного окружения.Особенности обработки ошибок в триггерах на события CONNECT и DISCONNECT смотри в секции ALTER SESSION RESET.

Триггеры на события транзакций срабатывают при старте транзакции, её подтверждении или откате.Не перехваченные исключения обрабатываются в зависимости от типа события:

  • для события TRANSACTION START исключение возвращается клиенту, а транзакция отменяется;

  • для события TRANSACTION COMMIT исключение возвращается клиенту, действия, выполненные триггером, и транзакция отменяются;

  • для события TRANSACTION ROLLBACK исключение не возвращается клиенту, а транзакция, как и предусмотрено, отменяется.

Ловушки

Из вышеизложенного следует, что нет прямого способа узнать, какой триггер (DISCONNECT или ROLLBACK) вызвал исключение.Также ясно, что вы не сможете подключиться к базе данных в случае исключения в триггере на событие CONNECT, а также отменяется старт транзакции при исключении в триггере на событие TRANSACTION START.В обоих случаях база данных эффективно блокируется до тех пор, пока вы не отключите триггеры базы данных и не исправите ошибочный код.

Отключение триггеров

В некоторые утилиты командной строки Firebird были добавлены новые ключи для отключения триггеров на базу данных:

gbak -nodbtriggers
isql -nodbtriggers
nbackup -T

Эти ключи могут использоваться только SYSDBA или владельцем базы данных.

Двухфазное подтверждение транзакций

В случае двухфазных транзакций триггеры на событие TRANSACTION START срабатывают в фазе подготовки (prepare), а не в фазе commit.

Предостережения

  1. Триггеры для событий базы данных DISCONNECT и ROLLBACK не будут вызваны при отключении клиентов через таблицы мониторинга (DELETE FROM MON$ATTACHMENTS).

  2. Использование оператора IN AUTONOMOUS TRANSACTION DO в триггерах на событие базы данных связанные с транзакциями (COMMIT, ROLLBACK, START) может привести к его зацикливанию.