diff options
-rw-r--r-- | doc/src/sgml/trigger.sgml | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml index 6e1f370b213..a5390ff6443 100644 --- a/doc/src/sgml/trigger.sgml +++ b/doc/src/sgml/trigger.sgml @@ -132,29 +132,19 @@ </para> <para> - A statement that targets a parent table in an inheritance or partitioning - hierarchy does not cause the statement-level triggers of affected child - tables to be fired; only the parent table's statement-level triggers are - fired. However, row-level triggers of any affected child tables will be - fired. + If an <command>INSERT</command> contains an <literal>ON CONFLICT + DO UPDATE</literal> clause, it is possible for row-level + <literal>BEFORE</literal> <command>INSERT</command> and then + <literal>BEFORE</literal> <command>UPDATE</command> triggers + to be executed on triggered rows. Such interactions can be + complex if the triggers are not idempotent because change made by + <literal>BEFORE</literal> <command>INSERT</command> triggers will be + seen by <literal>BEFORE</literal> <command>UPDATE</command> triggers, + including changes to <varname>EXCLUDED</varname> columns. </para> <para> - If an <command>INSERT</command> contains an <literal>ON CONFLICT - DO UPDATE</literal> clause, it is possible that the effects of - row-level <literal>BEFORE</literal> <command>INSERT</command> triggers and - row-level <literal>BEFORE</literal> <command>UPDATE</command> triggers can - both be applied in a way that is apparent from the final state of - the updated row, if an <varname>EXCLUDED</varname> column is referenced. - There need not be an <varname>EXCLUDED</varname> column reference for - both sets of row-level <literal>BEFORE</literal> triggers to execute, - though. The - possibility of surprising outcomes should be considered when there - are both <literal>BEFORE</literal> <command>INSERT</command> and - <literal>BEFORE</literal> <command>UPDATE</command> row-level triggers - that change a row being inserted/updated (this can be - problematic even if the modifications are more or less equivalent, if - they're not also idempotent). Note that statement-level + Note that statement-level <command>UPDATE</command> triggers are executed when <literal>ON CONFLICT DO UPDATE</literal> is specified, regardless of whether or not any rows were affected by the <command>UPDATE</command> (and @@ -170,6 +160,14 @@ </para> <para> + A statement that targets a parent table in an inheritance or partitioning + hierarchy does not cause the statement-level triggers of affected child + tables to be fired; only the parent table's statement-level triggers are + fired. However, row-level triggers of any affected child tables will be + fired. + </para> + + <para> If an <command>UPDATE</command> on a partitioned table causes a row to move to another partition, it will be performed as a <command>DELETE</command> from the original partition followed by an <command>INSERT</command> into |