On Wed, 2021-04-28 at 13:24 +0200, Laurenz Albe wrote: > On Tue, 2021-04-27 at 14:26 +0000, PG Doc comments form wrote: > > https://www.postgresql.org/docs/current/sql-createtrigger.html mentions the > > word "transaction" only once, in reference specifically to constraint > > triggers: "They can be fired either at the end of the statement causing the > > triggering event, or at the end of the containing transaction; in the latter > > case they are said to be deferred." > > > > If I understand correctly, it would be helpful to add this sentence or a > > corrected version of it: "Triggers always execute in the same transaction as > > the triggering event, and if a trigger fails, the transaction is rolled > > back." > > Good idea in principle, but I'd put that information on > https://www.postgresql.org/docs/current/trigger-definition.html
Here is a proposed patch for this. Yours, Laurenz Albe
From 393cdf38d812b337b51e3f5ca2af6ca052ed1b17 Mon Sep 17 00:00:00 2001 From: Laurenz Albe <laurenz.a...@cybertec.at> Date: Wed, 5 May 2021 11:53:38 +0200 Subject: [PATCH] Document how triggers interact with transactions Clarify that triggers are always executed as part of the same transaction as the triggering statement, with all consequences. Add an index term for constraint triggers and mention them in the documentation of trigger behavior. --- doc/src/sgml/ref/create_trigger.sgml | 4 ++++ doc/src/sgml/trigger.sgml | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml index 561af989a4..e46b9e79db 100644 --- a/doc/src/sgml/ref/create_trigger.sgml +++ b/doc/src/sgml/ref/create_trigger.sgml @@ -175,6 +175,10 @@ CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER <replaceable class="parameter">name </para> <para> + <indexterm> + <primary>trigger</primary> + <secondary>constraint trigger</secondary> + </indexterm> When the <literal>CONSTRAINT</literal> option is specified, this command creates a <firstterm>constraint trigger</firstterm>. This is the same as a regular trigger except that the timing of the trigger firing can be adjusted using diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml index 4a0e74652f..0c8cc8d0fe 100644 --- a/doc/src/sgml/trigger.sgml +++ b/doc/src/sgml/trigger.sgml @@ -47,7 +47,9 @@ the <command>UPDATE</command> statement. Triggers can also fire for <command>TRUNCATE</command> statements. If a trigger event occurs, the trigger's function is called at the appropriate time to handle the - event. + event. All triggers are executed as part of the same transaction as + the statement that triggered them, so if either the statement or the + trigger causes an error, the effects of both will be rolled back. </para> <para> @@ -115,6 +117,9 @@ <literal>BEFORE</literal> triggers fire immediately before a particular row is operated on, while row-level <literal>AFTER</literal> triggers fire at the end of the statement (but before any statement-level <literal>AFTER</literal> triggers). + The execution of <literal>AFTER</literal> triggers can also be deferred to the + end of the transaction if they were defined as + <firstterm>constraint triggers</firstterm>. These types of triggers may only be defined on tables and foreign tables, not views. <literal>INSTEAD OF</literal> triggers may only be -- 2.26.3