Thread: apparent RI bug
it appears I have a broken RI in my db. call_individual.clh_id references call_household.clh_id \d call_individual ... Foreign-key constraints: "call_individual_clh_id_fkey" FOREIGN KEY (clh_id) REFERENCES call_household(clh_id) ON DELETE CASCADE however: development=# select clh_id from call_individual cli where not exists( select 1 from call_household clh where clh.clh_id=cli.clh_id );clh_id -------- 14691 should not matter, but call_individual has a pre-delete trigger that simply raises an exception to prevent deletions: raise exception 'calls may not be deleted'; ____________________________________________________________________________________ You rock. That's why Blockbuster's offering you one month of Blockbuster Total Access, No Cost. http://tc.deals.yahoo.com/tc/blockbuster/text5.com
On Wed, 2 Apr 2008, chester c young wrote: > it appears I have a broken RI in my db. > > call_individual.clh_id references call_household.clh_id > > \d call_individual > ... > Foreign-key constraints: > "call_individual_clh_id_fkey" FOREIGN KEY (clh_id) REFERENCES > call_household(clh_id) ON DELETE CASCADE > > however: > development=# select clh_id from call_individual cli where not exists( > select 1 from call_household clh where clh.clh_id=cli.clh_id ); > clh_id > -------- > 14691 > > should not matter, but call_individual has a pre-delete trigger that > simply raises an exception to prevent deletions: > raise exception 'calls may not be deleted'; Yeah, that looks pretty broken. Can you reproduce this from a clean start repeatedly or is this a one off? Do you ever turn off triggers, perhaps by modifying the pg_class row's reltriggers (I'd guess the answer is no, but it'd be good to make sure)?
Stephan Szabo <sszabo@megazone.bigpanda.com> wrote: > On Wed, 2 Apr 2008, chester c young wrote: > > > it appears I have a broken RI in my db. > Yeah, that looks pretty broken. Can you reproduce this from a clean > start repeatedly or is this a one off? Do you ever turn off triggers, > perhaps by modifying the pg_class row's reltriggers (I'd guess the > answer is no, but it'd be good to make sure)? only one error. unable to duplicate so far. this is a development db - triggers are frequently dropped and created, but I don't think ever concurrently with db activity. ____________________________________________________________________________________ You rock. That's why Blockbuster's offering you one month of Blockbuster Total Access, No Cost. http://tc.deals.yahoo.com/tc/blockbuster/text5.com
On Thu, 3 Apr 2008, chester c young wrote: > > Stephan Szabo <sszabo@megazone.bigpanda.com> wrote: > > > On Wed, 2 Apr 2008, chester c young wrote: > > > > > it appears I have a broken RI in my db. > > > Yeah, that looks pretty broken. Can you reproduce this from a clean > > start repeatedly or is this a one off? Do you ever turn off triggers, > > perhaps by modifying the pg_class row's reltriggers (I'd guess the > > answer is no, but it'd be good to make sure)? > > only one error. unable to duplicate so far. > > this is a development db - triggers are frequently dropped and created, > but I don't think ever concurrently with db activity. Is it possible you ever had a before delete trigger that just did a return NULL rather than raising an exception? IIRC, explicitly telling the system to ignore the delete will work on the referential actions.
--- Stephan Szabo <sszabo@megazone.bigpanda.com> wrote: > Is it possible you ever had a before delete trigger that just did a > return > NULL rather than raising an exception? IIRC, explicitly telling the > system to ignore the delete will work on the referential actions. yes, it is possible, for example, a function without a body or without a "return old". are you saying this would override the RI constraint? if so, is this by design? ____________________________________________________________________________________ You rock. That's why Blockbuster's offering you one month of Blockbuster Total Access, No Cost. http://tc.deals.yahoo.com/tc/blockbuster/text5.com
On Thu, 3 Apr 2008, chester c young wrote: > --- Stephan Szabo <sszabo@megazone.bigpanda.com> wrote: > > > Is it possible you ever had a before delete trigger that just did a > > return > > NULL rather than raising an exception? IIRC, explicitly telling the > > system to ignore the delete will work on the referential actions. > > yes, it is possible, for example, a function without a body or without > a "return old". > > are you saying this would override the RI constraint? If it returned something that would have prevented the delete without an error, yes. > if so, is this by design? It's basically an ongoing question (without concensus AFAIK) about whether a rule or trigger should be allowed to stop the referential action and what should happen if it does.
--- Stephan Szabo <sszabo@megazone.bigpanda.com> wrote: > > is it is possible, for example, a function without a body or > without a "return old". > > > > are you saying this would override the RI constraint? > > If it returned something that would have prevented the delete without > an error, yes. this is very good news that there is a reason why the RI did not work, which is to say, RI not working randomly is very frightening > > if so, is this by design? > > It's basically an ongoing question (without concensus AFAIK) about > whether > a rule or trigger should be allowed to stop the referential action > and > what should happen if it does. in my opinion the most important thing is that it's documented. btw, cheers! you're my hero of the week!! ____________________________________________________________________________________ You rock. That's why Blockbuster's offering you one month of Blockbuster Total Access, No Cost. http://tc.deals.yahoo.com/tc/blockbuster/text5.com