gpt4 book ai didi

sql - PostgreSQL - ENABLE/DISABLE 触发器是否回滚?

转载 作者:行者123 更新时间:2023-11-29 13:09:57 25 4
gpt4 key购买 nike

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

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

ALTER TABLE sc.TBL 禁用触发器 TR_TBL_Delete; --- 1

还有

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

现在...我知道如果函数体中出现错误,所有由 UPDATE、DELETE 等语句对 DB 所做的更改都将被回滚。无论是否有 EXCEPTION(即捕获异常) block 作为主要功能 block 的一部分,这都会发生。

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

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

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

如果可能的话,我需要一个权威的答案,并引用一些官方文档。

最佳答案

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

这些 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;

关于sql - PostgreSQL - ENABLE/DISABLE 触发器是否回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56256595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com