【问题标题】:oracle trigger on deleteoracle 在删除时触发
【发布时间】:2014-09-13 15:12:33
【问题描述】:

好的,所以我已经坚持了大约 2 个小时,但我仍然找不到解决方案。

我有 2 个数据库实例。

站点 1 可以说, 表 A ID 属性 1 foreignKey - (表 B 的主键)

站点 2 有, 表 B ID 属性1

我想在删除表 A 的记录时创建触发器。它主要检查站点 2 表 B 是否引用了该特定记录。如果它确实有该记录,我想防止删除发生。到目前为止,我想出了这个,

CREATE OR REPLACE TRIGGER CHECK_DEALERSHIP_USAGE
BEFORE DELETE on TBL_CARDEALERSHIP
FOR each ROW
 declare
  rowcnt number;
  begin
  SELECT COUNT(DEALERSHIP_ID) INTO rowcnt 
  from TBL_SALESPEOPLE@SITE1
  where DEALERSHIP_ID = :NEW.DEALERSHIP_ID;
  if (rowcnt>0) THEN
     Raise_Application_Error (-20100, 'This dealership is used in the sales people table.');
  end if;
end;

然后我这样做,

delete from TBL_CARDEALERSHIP
where DEALERSHIP_ID='83';

但它仍然删除它,即使我认为我在数据库中有记录

【问题讨论】:

  • 在删除触发器中,您需要引用 old 记录,例如where DEALERSHIP_ID = :OLD.DEALERSHIP_ID;

标签: oracle triggers cascading-deletes


【解决方案1】:

正如 DrabJay 在 cmets 中所说,删除触发器中的 NEW 记录为 NULL,因为它是在删除之后。

但是,坦率地说,你做错了。这种事情应该用外键来完成,而不是在触发器中。

CREATE TABLE TBL_CARDEALERSHIP (
    ... columns ...
    CONSTRAINT fk_salesppl FOREIGN KEY (dealership_id)
        REFERENCES tbl_salespeople (dealership_id)
);

【讨论】:

  • 对数据库链接的约束?
  • 啊,我没注意到。你是对的,这在链接中是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多