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

Reply via email to