The following bug has been logged online:

Bug reference:      4396
Logged by:          Stephen Cuppett
Email address:      [EMAIL PROTECTED]
PostgreSQL version: 8.3.3
Operating system:   RHEL5.2 x86_64
Description:        Trigger event fired "UPDATE" when "DELETE" happening via
foreign key
Details: 

I have the following chain of tables:

release -> feature -> testcase -> execution -> execution_history

All tables have a parent_id column to the previous table with a foreign key
specified as ON DELETE CASCADE.  One to Many the whole way down.

When I delete a release, the whole chain gets deleted.

I have this trigger defined:

CREATE OR REPLACE FUNCTION execution_history()
  RETURNS trigger AS
$BODY$
        BEGIN
                IF (TG_OP = 'UPDATE') THEN
                        INSERT INTO execution_history (
                                execution_id, reporter, complete_units, 
                                failed_units, blocked_units,
                                attempted_units, created, remote_rpt, 
remote_addr, 
                                reported
                        ) VALUES (
                                OLD.id, OLD.reporter, OLD.complete_units,
                                OLD.failed_units, OLD.blocked_units,
                                OLD.attempted_units, OLD.updated, 
OLD.remote_rpt, OLD.remote_addr,
                                OLD.reported
                        );              
                END IF;
                RETURN NEW;
        END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

CREATE TRIGGER execution_history
  AFTER UPDATE
  ON executions
  FOR EACH ROW
  EXECUTE PROCEDURE execution_history();


Yet, when I go to delete a release, I get the following error:

Query: DELETE FROM "releases" WHERE "id" IN ('3') 
Warning: SQL Error: ERROR: insert or update on table "execution_history"
violates foreign key constraint "execution_history_execution_id_fkey"
DETAIL: Key (execution_id)=(5830) is not present in table "executions".
CONTEXT: SQL statement "INSERT INTO execution_history ( execution_id,
reporter, complete_units, failed_units, blocked_units, attempted_units,
created, remote_rpt, remote_addr, reported ) VALUES ( $1 , $2 , $3 , $4 , $5
, $6 , $7 , $8 , $9 , $10 )" PL/pgSQL function "execution_history" line 3 at
SQL statement

I previously didn't have the TG_OP comparison, so I added the one to ensure
it was an "UPDATE".  This doesn't appear to be correct behavior?

On the release and feature tables I have both an UPDATE for every row and
INSERT for every row trigger and they are *not* also firing.  So I can't
figure out why this one would?

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to