Re: Foreign key trigger timing bug? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Foreign key trigger timing bug?
Date
Msg-id 200512091942.jB9JgrA25777@candle.pha.pa.us
Whole thread Raw
In response to Re: Foreign key trigger timing bug?  (Stephan Szabo <sszabo@megazone.bigpanda.com>)
List pgsql-hackers
Stephan Szabo wrote:
> On Wed, 7 Dec 2005, Bruce Momjian wrote:
>
> > I had an open 8.1 item that was:
> >
> >     o  fix foreign trigger timing issue
> >
> > Would someone supply text for a TODO entry on this, as I don't think we
> > fixed it in 8.1.
>
> I'd split this into two separate items now.
>
>  Fix before delete triggers on cascaded deletes to run after the cascaded
> delete is done.  This is odd, but seems to be what the spec requires.
>
>  Fix problems with referential action caused before triggers that modify
> rows that would also be modified by the referential action.  Right now,
> this has a few symptoms, either you can get spurious seeming errors from
> the constraint or you can end up with invalid data in the referencing
> table. As far as I can see, the spec doesn't have much to say about this
> because the spec doesn't seem to allow before triggers to modify tables.

I have updated the CREATE TRIGGER documentation to highlight these
items, and the fact we consider our current behavior on the first item
to be correct.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/ref/create_trigger.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/create_trigger.sgml,v
retrieving revision 1.42
diff -c -c -r1.42 create_trigger.sgml
*** doc/src/sgml/ref/create_trigger.sgml    1 Nov 2005 21:09:50 -0000    1.42
--- doc/src/sgml/ref/create_trigger.sgml    9 Dec 2005 19:38:27 -0000
***************
*** 241,253 ****
        function that executes the desired commands.
       </para>
      </listitem>
     </itemizedlist>
    </para>

    <para>
     SQL specifies that multiple triggers should be fired in
     time-of-creation order.  <productname>PostgreSQL</productname> uses
!    name order, which was judged more convenient to work with.
    </para>

    <para>
--- 241,265 ----
        function that executes the desired commands.
       </para>
      </listitem>
+
     </itemizedlist>
    </para>

    <para>
     SQL specifies that multiple triggers should be fired in
     time-of-creation order.  <productname>PostgreSQL</productname> uses
!    name order, which was judged to be more convenient.
!   </para>
!
!   <para>
!    SQL specifies that <literal>BEFORE DELETE</literal> triggers on cascaded
!    deletes fire <emphasis>after</> the cascaded <literal>DELETE</> completes.
!    The <productname>PostgreSQL</productname> behavior is for <literal>BEFORE
!    DELETE</literal> to always fire before the delete action, even a cascading
!    one.  This is considered more consistent.  There is also unpredictable
!    behavior when <literal>BEFORE</literal> triggers modify rows that are later
!    to be modified by referential actions.  This can lead to contraint violations
!    or stored data that does not honor the referential constraint.
    </para>

    <para>

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Log of CREATE USER statement
Next
From: "Luke Lonergan"
Date:
Subject: Re: Warm-cache prefetching