【发布时间】:2013-03-06 15:00:42
【问题描述】:
我有主表 AAAA 和表 BBBB,它们有 FK 到表 AAAA。 FK 约束为 ON 删除设置为空。 还有触发器 ON DELETE ON table BBBB。 在此触发器中,从 AAAA 中删除... 为什么在执行从 AAAA 中删除时会执行此触发器? (嗯,有递归异常,所以不执行)。
CREATE TABLE AAAA
(
"AAAA_PK" NUMBER NOT NULL ENABLE,
"AAAA_VALUE" NUMBER,
CONSTRAINT "AAAA_PK" PRIMARY KEY ("AAAA_PK")
)
CREATE TABLE "BBBB"
(
"BBBB_PK" NUMBER NOT NULL ENABLE,
"BBBB_FK" NUMBER DEFAULT NULL,
CONSTRAINT "BBBB_PK" PRIMARY KEY ("BBBB_PK"),
CONSTRAINT "BBBB_AAAA_FK1" FOREIGN KEY ("BBBB_FK") REFERENCES AAAA ("AAAA_PK") ON
DELETE SET NULL ENABLE
)
CREATE OR REPLACE TRIGGER TRIG_ON_AFTER_BBBB_DELETE_ALL AFTER
DELETE ON bbbb
BEGIN
-- delete from aaaa where ....
dbms_output.put_line('TRIGGER EXECUTED');
END;
添加一些数据,例如 AAAA(1,1) 和 BBBB(1,1)
如果我从 AAAA 中删除行,我希望 BBBB 中的 FK 设置为 null,但它失败了
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-06512: at TRIG_ON_AFTER_BBBB_DELETE_ALL, line 2
ORA-04088: error during execution of trigger TRIG_ON_AFTER_BBBB_DELETE_ALL
如果我只有输出打印的触发器,它会被执行 - 但我不会从表 BBBB 中删除!
那么为什么要执行触发器呢?
【问题讨论】:
-
触发器中的
delete from aaa...是什么?如果它在你的真实触发器中是“活跃的”,它将导致递归。 -
当然,我理解递归,但如果我留在触发器中,只需打印一些行,它就会被调用并工作。问题是为什么在表 bbbb 上没有删除时执行(调用)该触发器(并且此操作应该导致触发器执行)。
-
在 Oracle 11.1.0.7.0 上复制
标签: oracle triggers foreign-keys constraints