Firebird" For Each Row"触发语法

时间:2014-07-18 17:34:48

标签: firebird firebird2.5

文档中存在混淆,并在线搜索有关语句和行级触发器的支持。根据我看到的文档,最新版本的Firebird支持语句和行级触发器。

Firebird据说支持SQL-92/99。标准方法是在触发器SQL中使用“for each row”,但这会导致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上发布更新事件。当我更新多行时,它只会发布一个事件。

触发器语句的语法是什么让它执行行级触发器,以便我可以发布更新的每个行的事件?

2 个答案:

答案 0 :(得分:4)

Firebird没有语句级触发器。只需将其创建为第一个。它是行级触发器。

你说它只发布了一个事件。您似乎也没有理解Firebird事件是如何工作的。它将被发布一次,但您可以通过事件计数器查看多少次。他们会在提交时发布。

答案 1 :(得分:2)

Firebird中的触发器始终是行级别,从不是语句级别。文档(Interbase 6.0语言参考,第82页;可从Firebird website获得)说:

  

CREATE TRIGGER定义数据库的新触发器。触发器是独立的   与表格或视图相关联的程序,在a时自动执行操作   插入,更新或删除表格或视图中的行

正如Adriano已经解释的那样,事件是在事务提交时发送的。如果您在一次交易中多次发布同一事件,则只会发布一个事件(事件中的计数)。

事件用于向其他应用程序发送信号,而不是数据库本身(这就是触发器本身的用途),因此 - afaik - 您无法注册,也无法从触发器或存储过程中确定事件计数。应用程序注册事件。如何完成取决于编程语言和驱动程序。

许多(旧的)Interbase文档显示了使用EVENT INITEVENT WAIT的示例,但这仅适用于需要预处理器并且几乎不使用的嵌入式SQL。使用Java和Jaybird,您可以使用FBEventManager来监听事件,使用C#和Firebird .net提供程序,您可以使用FbRemoteEvent。如果您使用Firebird C API,则需要使用isc_que_events