封装事务中的语句是否包含它触发的触发器?

时间:2018-04-23 10:15:04

标签: postgresql triggers transactions consistency

我有一个INSERT会触发TRIGGERUPDATETABLE另一个INSERT上的属性。我需要确保如果UPDATE成功且TRIGGER内的INSERT不成功,那么整个事情应该回滚。

在事务中封装global Example Example = 5 是否可以保证这一点?

如果没有,我该怎么做?

1 个答案:

答案 0 :(得分:2)

触发器是包含原始INSERT

的数据库事务的一部分

事务中的任何错误(未处理)都会导致整个事务回滚,就像从未发生过一样。这将包括导致触发器运行的INSERT

所以你不需要做任何事情;它会以你想要的方式工作。

您可以通过设置SAVEPOINT并使用ROLLBACK TO SAVEPOINT(或使用PL / pgSQL中的BEGIN ... EXCEPTION ... END块来显式处理事务内部的错误,这在块下也是如此)。

要触发异常,请运行导致错误的SQL语句(如SELECT 1/0)或使用PL / pgSQL中的RAISE EXCEPTION语句(其他过程语言也有类似的方法)。< / p>