1

我有主表 AAAA 和表 BBBB,它有 FK 到表 AAAA。FK 约束为 ON DELETE SET NULL。还有触发器 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 设置为空,但它失败了

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 中删除!

那么为什么要执行触发器呢?

4

1 回答 1

0

在我的测试中,删除父表时,AFTER DELETEAFTER UPDATE 触发器都会在子表上触发,这是不直观的。我不确定这是否是预期的行为 - 可能是一个错误,但我不确定。

但是,子表上的行级触发器只会按预期触发 - 即不会触发 AFTER DELETE FOR EACH ROW 触发器,但触发 AFTER UPDATE FOR EACH ROW 触发器。

无论如何,解决这个问题的方法是使用 AFTER DELETE FOR EACH ROW 触发器而不是语句级触发器。如果需要,在 after 语句触发器中记录要处理的包中的行 ID。

于 2013-03-19T05:08:22.797 回答