文档中存在混淆,并在线搜索有关语句和行级触发器的支持。根据我看到的文档,最新版本的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上发布更新事件。当我更新多行时,它只会发布一个事件。
触发器语句的语法是什么让它执行行级触发器,以便我可以发布更新的每个行的事件?
答案 0 :(得分:4)
Firebird没有语句级触发器。只需将其创建为第一个。它是行级触发器。
你说它只发布了一个事件。您似乎也没有理解Firebird事件是如何工作的。它将被发布一次,但您可以通过事件计数器查看多少次。他们会在提交时发布。
答案 1 :(得分:2)
Firebird中的触发器始终是行级别,从不是语句级别。文档(Interbase 6.0语言参考,第82页;可从Firebird website获得)说:
CREATE TRIGGER
定义数据库的新触发器。触发器是独立的 与表格或视图相关联的程序,在a时自动执行操作 插入,更新或删除表格或视图中的行。
正如Adriano已经解释的那样,事件是在事务提交时发送的。如果您在一次交易中多次发布同一事件,则只会发布一个事件(事件中的计数)。
事件用于向其他应用程序发送信号,而不是数据库本身(这就是触发器本身的用途),因此 - afaik - 您无法注册,也无法从触发器或存储过程中确定事件计数。应用程序注册事件。如何完成取决于编程语言和驱动程序。
许多(旧的)Interbase文档显示了使用EVENT INIT
和EVENT WAIT
的示例,但这仅适用于需要预处理器并且几乎不使用的嵌入式SQL。使用Java和Jaybird,您可以使用FBEventManager
来监听事件,使用C#和Firebird .net提供程序,您可以使用FbRemoteEvent
。如果您使用Firebird C API,则需要使用isc_que_events
。