在表 1中,我有触发器 1插入到表 3中,触发器 3使用表 2中触发器 2的结果。Firebird 2.5 中是否有办法仅在表 2中的触发器 2之后午餐表 1中的触发器 1?也许有些“等待触发”?
问问题
810 次
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_CONTEXT与USER_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 回答