【问题标题】:Triggers in Oracle to keep data integrityOracle 中的触发器以保持数据完整性
【发布时间】:2013-03-26 02:01:13
【问题描述】:

我有一个包含商店和出租副本的数据库。每个出租副本都分配给一个商店。我想创建一个触发器,如果​​您删除某个商店,它将将该商店中的所有副本分配给另一个预定义的商店 (cvr)。

我试过这样:

 CREATE OR REPLACE TRIGGER delete_trig
 BEFORE DELETE ON Store
 FOR EACH ROW
 BEGIN
 UPDATE RentalCopy SET cvr = 123456789
 WHERE cvr = :old.cvr;
 END;

我收到一条错误消息,指出我违反了先前添加的约束(负责处理这两个表之间的外键),因为它找到了一条子记录。我该如何解决?

这些表的表定义:(相关部分)

租赁副本:

   barcode INTEGER NOT NULL,
   CVR INTEGER NOT NULL,    
   PRIMARY KEY(barcode),
   CONSTRAINT fk_storeinfo
   FOREIGN KEY (CVR) REFERENCES Store 

商店:

 CVR INTEGER NOT NULL,  
 store_name VARCHAR2(30) NOT NULL,                     
  PRIMARY KEY(CVR)

【问题讨论】:

  • 请添加表定义(至少与相关列)和对它们定义的约束。
  • 您能否使约束延迟?或者将删除包装在一个过程调用中以首先进行更新(并可能为repelacement store ID获取一个参数)?
  • 你确定你的触发器编译成功了吗?您在此处显示的内容适用于适当的触发器(已在本地测试,但也适用于 on this SQL Fiddle

标签: database oracle triggers constraints


【解决方案1】:

查看您的代码,您的表 RentalCopy 似乎通过两个表的列 CVR 上的外键连接到 Store。

因此,RentalCopy 中的 CVR 值必须在 Store 表上有对应的 cvr,否则会出现外键错误。

您遇到的错误可能是因为您试图从 Store 中删除/更新 cvr 记录 (因为表 RentalCopy 的外键在 Store 表中没有 cvr 作为子表),而不是因为任何触发器语法错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多