FirebirdSQL logo
 VIEWPROCEDURE 

Триггеры на событие базы данных

Триггер может быть создан для одного из событий базы данных:

  • CONNECT (соединение с базой данных или после сброса сеанса);

  • DISCONNECT (отсоединение от базы данных или перед сбросом сеанса);

  • TRANSACTION START (старт транзакции);

  • TRANSACTION COMMIT (подтверждение транзакции);

  • TRANSACTION ROLLBACK (откат транзакции).

Контекстная переменная RESETTING может использоваться в триггерах на события CONNECT и DISCONNECT для того, чтобы отличить сброс сеанса от подключения/отключения от базы данных.

Указать для триггера несколько событий базы данных невозможно.

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

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

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

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

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

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

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

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

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

Ловушки

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