1

表 1中,我有触发器 1插入到表 3中,触发器 3使用表 2中触发器 2的结果。Firebird 2.5 中是否有办法仅在表 2中的触发器 2之后午餐表 1中的触发器 1?也许有些“等待触发”?

4

1 回答 1

1

不,在 Firebird 2.5 中,您不能指定触发器仅在其他触发器之后运行。

触发器的执行顺序由触发它们的语句的顺序决定,即如果你使用

INSERT INTO table2 ...
INSERT INTO table1 ...

然后 ( ON INSERT) 触发器在触发器table2之前执行table1。如果 table 有多个给定类型的触发器,则顺序由POSITION触发器声明的子句确定。

如果您不能保证INSERT语句的顺序,那么也许您可以使用数据库触发器作为一种解决方法 - 创建一个ON TRANSACTION COMMIT触发器,您可以在其中检查您在trigger2. 如果标志在那里,则执行需要在trigger2. 要设置标志,您可以将RDB$SET_CONTEXTUSER_TRANSACTION命名空间一起使用。就像是

CREATE TRIGGER trigger2 ACTIVE AFTER INSERT ON table2
AS
BEGIN
  RDB$SET_CONTEXT ('USER_TRANSACTION', 'doTrigger1', 1);
END

CREATE TRIGGER trigger1 ACTIVE ON TRANSACTION COMMIT
AS
BEGIN
  IF(RDB$GET_CONTEXT ('USER_TRANSACTION', 'doTrigger1') = 1)THEN BEGIN
     -- proccess data
  END
END

有关完整的TRIGGER DDL 语法,请参阅 Firebirds 语言参考。

于 2013-05-01T11:54:04.257 回答