我有一个PL/pgSQL函数,它的主体包含一些常规的/普通的DML语句...如更新、删除等。
但是在这个函数的主体中也有这样的语句:
ALTER TABLE sc.TBL DISABLE TRIGGER TR_TBL_Delete; --- 1
而且还
ALTER TABLE sc.TBL ENABLE TRIGGER TR_TBL_Delete; --- 2
现在..。我知道如果在函数的主体中发生错误,所有由UPDATE、DELETE等语句对数据库所做的更改都将被回滚。无论是否有一个异常(即捕获异常)块作为主函数块的一部分,这种情况都会发生。
请注意,在进入函数时,所有触发器都处于启用状态。,因此我希望100%确定在退出函数时,它们也将处于启用状态。
所以..。我对此有些担心...我想知道是否可能有一些触发器因为没有达到--- 2
形式的语句而保持禁用状态(由于发生的错误)。
在某种程度上,我想知道ENABLE TRIGGER/DISABLE TRIGGER
语句是否也参与执行函数体的事务。
我需要一个权威的答案与一些参考官方文件,如果可能的话。
发布于 2019-05-23 06:06:17
我自己试了几个简单的测试。
这些启用/禁用触发器语句确实参与了事务。
这意味着它正在按照我想要/期望的方式工作。
我的测试表明,如果函数禁用触发器A,然后在到达相应的启用触发器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;
https://stackoverflow.com/questions/56256595
复制相似问题