我正在为实际目的编写一个数据库,目前涉及一些触发器和约束。
我的一个触发器必须在删除指定的行之前将列值设置为0,但删除不能使用约束...所以我决定BEFORE DELETE
我删除约束然后我更新我的来自另一个表的列值我将ADD
再次使用我的第二个触发器。
但是我可以让它发挥作用:
ALTER TABLE teams ADD CONSTRAINT teams_to_trainer FOREIGN KEY (coda)
REFERENCES trainer(coda);
--insert values
--...
--Procedure in which I execute the alter table commands
CREATE OR REPLACE PROCEDURE constraint_operation (p_hardcod IN VARCHAR2)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
resource_busy EXCEPTION;
PRAGMA EXCEPTION_INIT(resource_busy,-54);
BEGIN
EXECUTE IMMEDIATE p_hardcod;
EXCEPTION
WHEN resource_busy
THEN
DBMS_LOCK.SLEEP(5);
COMMIT;
END;
/
--My Two Triggers
CREATE OR REPLACE TRIGGER delete_trainer
BEFORE DELETE
ON trainer
FOR EACH ROW
BEGIN
constraint_operation('ALTER TABLE teams DROP CONSTRAINT teams_to_trainer');
UPDATE teams SET coda = 0 WHERE :old.coda = coda;
END;
/
CREATE OR REPLACE TRIGGER delete_trainer_add_constraint
AFTER DELETE
ON trainer
FOR EACH ROW
BEGIN
constraint_operation('ALTER TABLE teams ADD CONSTRAINT teams_to_trainer
FOREIGN KEY (coda)REFERENCES trainer(coda)');
END;
/
致电时:
DELETE FROM trainer WHERE coda = 14;
我明白了:
SQL错误:ORA-02291:完整性约束(USER.TEAMS_TO_TRAINER) 违反 - 未找到父密钥 02291. 00000 - “违反完整性约束(%s。%s) - 未找到父密钥” *原因:外键值没有匹配的主键值。 *操作:删除外键或添加匹配的主键。
我似乎无法找到问题,我认为调用该过程将删除约束。
我做错了什么?
谢谢。
答案 0 :(得分:1)
您正在将TEAMS中的外键列更新为TRAINER中引用的主键中不存在的值。
如果需要FK约束,一个简单的修复就是在TRAINER中添加默认/虚拟行,其中CODA中的值为0.