【问题标题】:PostgreSQL - are ENABLE/DISABLE trigger rolled back?PostgreSQL - 启用/禁用触发器是否回滚?
【发布时间】:2019-05-22 12:15:26
【问题描述】:

我有一个 PL/pgSQL 函数,它的主体包含一些常规/正常的 DML 语句...例如 UPDATE、DELETE 等。

但在这个函数的主体语句中也有:

ALTER TABLE sc.TBL DISABLE TRIGGER TR_TBL_Delete; --- 1

还有

ALTER TABLE sc.TBL ENABLE TRIGGER TR_TBL_Delete; --- 2

现在...我知道如果函数的主体发生错误,UPDATE、DELETE 等语句对数据库所做的所有更改都将回滚。无论是否将 EXCEPTION(即捕获异常)块作为主 func 块的一部分,都会发生这种情况。

请注意,在进入该函数时,所有触发器都处于 ENABLED 状态。 所以我想 100% 确定在退出函数时它们也将处于 ENABLED 状态。

所以...我对此有些担心...我想知道是否有可能某些触发器保持在 DISABLED 状态,因为没有达到--- 2 形式的语句(由于发生的错误)。

在某种程度上,我想知道ENABLE TRIGGER/DISABLE TRIGGER 语句是否也参与了执行 func 主体的事务。

如果可能的话,我需要一个权威的答案,并附上一些官方文档的参考资料。

【问题讨论】:

    标签: sql postgresql postgresql-11


    【解决方案1】:

    我自己尝试了一些简单的测试。

    这些 ENABLE/DISABLE 触发器语句确实参与了事务。
    这意味着它正在按照我想要/期望的方式工作。

    我所做的测试表明,如果函数禁用触发器 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;
    

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2021-12-03
      • 2021-07-26
      • 2011-12-29
      • 1970-01-01
      • 2011-09-23
      • 2021-05-27
      • 2021-11-17
      • 2011-04-25
      相关资源
      最近更新 更多