Re: DELETE CASCADE - Mailing list pgsql-hackers

From David Christensen
Subject Re: DELETE CASCADE
Date
Msg-id lza6myugzf.fsf@veeddrois.attlocal.net
Whole thread Raw
In response to Re: DELETE CASCADE  ("David G. Johnston" <david.g.johnston@gmail.com>)
Responses Re: DELETE CASCADE  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
David G. Johnston writes:

> Having the defined FK behaviors be more readily changeable, while not
> mitigating this need, is IMO a more important feature to implement.  If
> there is a reason that cannot be implemented (besides no one has bothered
> to take the time) then I would consider that reason to also apply to
> prevent implementing this work-around.
>
> David J.

I assume this would look something like:

ALTER TABLE foo ALTER CONSTRAINT my_fkey ON UPDATE CASCADE ON DELETE RESTRICT

with omitted referential_action implying preserving the existing one.

Seems if we were going to tackle this particular problem, there would be two possible approaches
here:

1) Change the definitions of the RI_FKey_* constraints for (at least) RI_FKey_*_del() to instead
share a single function definition RI_FKey_del() and then pass in the constraint type operation
(restrict, cascade, no action, etc) in as a trigger argument instead of having separate functions for
each constraint type here.  This would then ensure that the dispatch function could both change the
constriant just by modifying the trigger arguments, as well as allowing for potential different behavior
depending on how the underlying function is called.

2) Keep the existing RI trigger functions, but allow an ALTER CONSTRAINT variant to replace the
trigger function to the new desired value, preserving (or transforming, as necessary) the original
arguments.

A few things off-hand:

- pg_trigger locking will be necessary as we change the underlying args for the tables in
  question. This seems unavoidable.

- partitions; do we need to lock them all in both solutions, or can we get away without it in the
  first approach?

- with the first solution you would lose the self-describing name of the trigger functions
  themselves (moving to the trigger args instead); while it is a change in a very long-standing
  behavior/design, it *should* be an implementation detail, and allows things like the explicit
  DELETE [ RESTRICT | CASCADE ] the original patch was pushing for.

- probably more I haven't thought of.

Best,

David



pgsql-hackers by date:

Previous
From: Jacob Champion
Date:
Subject: Re: badly calculated width of emoji in psql
Next
From: Pavel Stehule
Date:
Subject: Re: badly calculated width of emoji in psql