Синтаксис триггера 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
,