Urgent: "on delete cascade" prevents delete trigger [message #25881] |
Thu, 22 May 2003 10:09  |
Marcus Rudke
Messages: 4 Registered: May 2003
|
Junior Member |
|
|
run into a problem concerning triggers and the 'on delete cascade' option.
Problem, looks simple, but...
-----------------------
I am using Oracle 8.1.5.
2 tables: TabA TabB
TabA is parent of TabB (foreign key in TabB references
field in TabA with 'on delete cascade').
Both Tables have an 'after delete' Trigger. These Triggers do _not_ change one
of the both tables (they can even be empty) in any way.
Problem: If I delete records in TabA only the Trigger of TabB is fired, 2 times!
It's possible to do this with 3 tables. Then the most inner trigger is fired 3 times.
What is wrong? Thank you very much in advance.
|
|
|
|
Re: Urgent: "on delete cascade" prevents delete trigger [message #25894 is a reply to message #25886] |
Fri, 23 May 2003 02:45   |
Marcus Rudke
Messages: 4 Registered: May 2003
|
Junior Member |
|
|
>Marcus, it would be helpful if you could post the
>triggers on both tables. If these are row triggers,
>the table A trigger should fire once and the table B
>trigger will fire for each child row. Post the
>triggers and we'll take a look at it...
OK, here they are. They are no row triggers and contain just dummy instructions (to debug). I post
the tables as well (at the end of this message,
consider the 'on cascade delete' option).
Triggers:
++++++++
Trigger for Table "A":
create or replace trigger AFTER_A AFTER DELETE ON A
BEGIN
dbms_output.put_line('AFTER A');
END;
Trigger for Table "B":
create or replace trigger AFTER_B AFTER DELETE ON B
BEGIN
dbms_output.put_line('AFTER B');
END;
Tables:
+++++++
create table A
(
A_ID NUMBER(9) PRIMARY KEY
);
create table B
(
B_ID NUMBER(9) PRIMARY KEY
);
alter table B
add constraint FK_B_A foreign key (B_ID)
references A (A_ID) on delete cascade;
--> on delete on Table "A" the output is:
'AFTER B'
'AFTER B'
Trigger A is NOT fired. Why?
|
|
|
Re: Urgent: "on delete cascade" prevents delete trigger [message #25897 is a reply to message #25894] |
Fri, 23 May 2003 11:51   |
Todd Barry
Messages: 4819 Registered: August 2001
|
Senior Member |
|
|
Here are my results with your exact code:
sql>create table A
2 (
3 A_ID NUMBER(9) PRIMARY KEY
4 );
Table created.
sql>create table B
2 (
3 B_ID NUMBER(9) PRIMARY KEY
4 );
Table created.
sql>alter table B
2 add constraint FK_B_A foreign key (B_ID)
3 references A (A_ID) on delete cascade;
Table altered.
sql>create or replace trigger AFTER_A AFTER DELETE ON A
2 BEGIN
3 dbms_output.put_line('AFTER A');
4 END;
5 /
Trigger created.
sql>create or replace trigger AFTER_B AFTER DELETE ON B
2 BEGIN
3 dbms_output.put_line('AFTER B');
4 END;
5 /
Trigger created.
sql>insert into a values (1);
1 row created.
sql>insert into b values (1);
1 row created.
sql>commit;
Commit complete.
sql>set serveroutput on
sql>delete from a where a_id = 1;
<b>AFTER B
AFTER A</b>
1 row deleted.
|
|
|
|
|
|