在Oracle中触发以保持数据完整性

时间:2013-04-04 06:07:35

标签: database oracle triggers constraints

我有一个包含商店和租赁副本的数据库。每个租赁副本都分配给商店。我想创建一个触发器,如果​​你删除某个商店,它会将该商店的所有副本分配给另一个预定义商店(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;

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

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

RentalCopy:

   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)

1 个答案:

答案 0 :(得分:1)

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

因此,RentalCopy中的CVR值必须在Store表上具有相应的cvr,否则将导致外键错误。

您获得的错误可能是因为您尝试从Store中删除/更新cvr记录 (因为那时表RentalCopy的forign键在Store表中没有cvr作为子项),而不是因为任何触发器语法错误