Синтаксис триггера Firebird "Для каждой строки"

Существует путаница в документации и поиске в Интернете о поддержке операторов и триггеров на уровне строк. Согласно документации, которую я видел, последняя версия Firebird поддерживает триггеры как на уровне операторов, так и на уровне строк.

Firebird предположительно поддерживает SQL-92/99. Стандартный подход для этого заключается в использовании "для каждой строки" в триггере SQL, однако это вызывает ошибку в Firebird.

Вот мой триггер уровня оператора, который работает:

CREATE TRIGGER myExampleTrigger FOR myTable
    AFTER UPDATE
    AS
    BEGIN
       POST_EVENT 'testEvent';
    END;

Вот мой триггер уровня строки, который не работает:

CREATE TRIGGER myExampleTrigger FOR myTable
    AFTER UPDATE
    AS 
    FOR EACH ROW
    BEGIN
       POST_EVENT 'testEvent';
    END;

Триггер уровня оператора работает для публикации события для обновлений на myTable. Когда я обновляю несколько строк, он публикует только одно событие.

Каков синтаксис оператора триггера, чтобы заставить его выполнять триггер на уровне строки, чтобы я мог опубликовать событие FOR EACH ROW, которое обновляется?

2 ответа

Решение

У Firebird нет триггеров на уровне операторов. Просто создайте его как первый. Это триггер на уровне строк.

Вы сказали, что это отправляет только одно событие. Похоже, вы также не поняли, как работают события Firebird. Он будет опубликован один раз, но вы можете увидеть, сколько раз по счетчику событий. Они размещены на коммите.

Триггеры в Firebird всегда на уровне строк, а не на уровне операторов. Документация (Справочник по языку Interbase 6.0, стр. 82; доступна на сайте Firebird) гласит:

CREATE TRIGGER определяет новый триггер для базы данных. Триггер - это автономная программа, связанная с таблицей или представлением, которая автоматически выполняет действие, когда строка в таблице или представлении вставляется, обновляется или удаляется.

Как уже объяснил Адриано, события отправляются при фиксации транзакции. Если вы публикуете одно и то же событие несколько раз в одной транзакции, будет опубликовано только одно событие (с количеством в событии).

События используются для передачи сигналов другим приложениям, а не самой базе данных (для этого и нужны сами триггеры), поэтому - afaik - вы не можете ни зарегистрироваться, ни определить количество событий в триггере или хранимой процедуре. Приложение регистрирует события. Как это сделать, зависит от языка программирования и драйвера.

Большая часть (старой) документации Interbase показывает пример использования EVENT INIT а также EVENT WAIT это, однако, только для встроенного SQL, который требует препроцессора и действительно редко используется. С Java и Jaybird вы можете использовать FBEventManager для прослушивания событий, с C# и провайдером Firebird .net вы можете использовать FbRemoteEvent, Если вы используете Firebird C API, вам нужно использовать isc_que_events,

Другие вопросы по тегам