我有一个PL/PGSQL功能,其身体包含一些常规/普通DML语句...例如更新,删除等。
,但此功能的身体语句中也有:
ALTER TABLE sc.TBL DISABLE TRIGGER TR_TBL_Delete; --- 1
以及
ALTER TABLE sc.TBL ENABLE TRIGGER TR_TBL_Delete; --- 2
现在...我知道,如果弹性的主体发生错误,则对更新,删除等对数据库进行的所有更改。语句将被回滚。无论是否有例外(即捕获异常(块作为主要弹药块的一部分,这都会发生这种情况。
请注意,在输入功能时,所有触发器都处于启用状态。因此,我想100%确保在退出功能时也将处于启用状态。
所以...我对此有些担心...我想知道是否有可能触发保持残疾状态,因为未达到--- 2
表格的说明(由于发生的错误(。
在某种程度上,我想知道ENABLE TRIGGER/DISABLE TRIGGER
语句是否也参与了执行Func主体的交易。
如果可能的话,我需要对官方文档的一些权威答案。
我自己尝试了一些简单的测试。
这些启用/禁用触发声明确实参与了交易。
这意味着它按照我想要/期望它可以正常工作。
我确实表明的测试表明,如果函数禁用触发器A,然后在到达相应启用触发器之前遇到错误,则对触发器进行的这些更改会回滚。因此...函数返回后,触发器仍处于启用状态。
BEGIN
ALTER TABLE TBL DISABLE TRIGGER A;
-- do some work (success)
-- more work here... but an error is raised
ALTER TABLE TBL ENABLE TRIGGER A; -- (not executed)
-- some other statements here (not executed)
END;