Синтаксис триггера 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. Когда я обновляю несколько строк, он публикует только одно событие.

Каков синтаксис оператора триггера, чтобы заставить его выполнять триггер на уровне строки, чтобы я мог опубликовать событие ДЛЯ КАЖДОЙ обновленной строки?


person mpearso3    schedule 18.07.2014    source источник


Ответы (2)


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

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

person Adriano dos Santos Fernandes    schedule 18.07.2014
comment
Спасибо за подсказку по использованию event_counter. Я просмотрел всю документацию и до сих пор не могу найти синтаксис для включения его в триггер. Я нашел несколько примеров использования event_count в хранимых процедурах, но не в триггерах. Вы знаете синтаксис? - person mpearso3; 19.07.2014
comment
Счетчики извлекаются обратным вызовом события. Это некоторая хитрость, но вы обязательно найдете какой-нибудь пример. - person Adriano dos Santos Fernandes; 19.07.2014
comment
@mpearso3 Зачем вам нужен счетчик событий в триггере: просто опубликуйте событие. Это должно быть интересно только тем, кто зарегистрировался на уведомление о событии. - person Mark Rotteveel; 19.07.2014
comment
@MarkRotteveel Я понимаю, что это представляет интерес только для тех, кто зарегистрировался для него, но причина, по которой я хотел, чтобы event_counter позволял мне видеть, сколько раз событие было запущено, или публиковать событие несколько раз в зависимости от того, сколько строк было выполнено. . - person mpearso3; 19.07.2014

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

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

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

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

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

person Mark Rotteveel    schedule 19.07.2014
comment
Спасибо за информацию. В документации firebird я нашел event_count в хранимой процедуре: CREATE PROCEDURE send_times(event_count integer) AS DECLARE VARIABLE nr INTEGER; НАЧАЛО № = 1; WHILE (nr ‹ event_count) DO BEGIN POST_EVENT 'MY_EVENT'; количество = количество + 1; КОНЕЦ КОНЕЦ ссылка - person mpearso3; 19.07.2014
comment
@mpearso3 mpearso3 Не могли бы вы дать ссылку на эту документацию? - person Mark Rotteveel; 19.07.2014
comment
А что касается триггеров на уровне строк и на уровне операторов, я понимаю, что уровень строк будет срабатывать, если это будет одновременное множественное обновление/вставка в таблицу, для которой вы регистрируетесь: уровень строки vs уровень оператора. Если firebird работает на уровне строк, то почему он запускает этот триггер только один раз, даже когда я обновляю несколько строк? - person mpearso3; 19.07.2014
comment
@mpearso3 Триггер срабатывает для каждой строки. Не путайте тот факт, что событие сигнализируется только один раз (при фиксации транзакции!) с количеством вызовов триггера. - person Mark Rotteveel; 19.07.2014