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

Does encapsulating a statement in a transaction include the triggers it fires?

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

INSERT 封装在事务中是否保证了这一点?

如果没有,我该怎么做?

触发器是包含原始 INSERT 的数据库事务的一部分。

交易中的任何错误(未处理)将导致整个交易回滚,就像什么都没发生过一样。这将包括导致触发器 运行.

INSERT

因此您无需做任何事情;它开箱即用。

您可以通过设置 SAVEPOINTs 并使用 ROLLBACK TO SAVEPOINT(或使用 PL/pgSQL 中的 BEGIN ... EXCEPTION ... END 块来显式处理事务内的错误引擎盖下也一样)。

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