如何在 PL/SQL 中删除触发器中的约束?
How to drop constraint in trigger in PL/SQL?
我正在为实际目的编写一个数据库,目前涉及一些触发器和约束。
我的一个触发器必须在删除指定行之前将列值设置为 0,但是删除不能与...上的约束一起使用,所以我决定 BEFORE DELETE
然后在我删除约束之后从另一个更新我的列值 table 我将 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 Error: ORA-02291: integrity constraint (USER.TEAMS_TO_TRAINER)
violated - parent key not found
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause: A foreign key value has no matching primary key value.
*Action: Delete the foreign key or add a matching primary key.
我似乎找不到问题,我以为调用该过程会解除约束。
我做错了什么?
谢谢。
您正在将 TEAMS 中的外键列更新为 TRAINER 中引用的主键中不存在的值。
如果需要 FK 约束,一个简单的修复方法是在 TRAINER 中添加一个 default/dummy 行,其中 CODA 中的值为 0。
我正在为实际目的编写一个数据库,目前涉及一些触发器和约束。
我的一个触发器必须在删除指定行之前将列值设置为 0,但是删除不能与...上的约束一起使用,所以我决定 BEFORE DELETE
然后在我删除约束之后从另一个更新我的列值 table 我将 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 Error: ORA-02291: integrity constraint (USER.TEAMS_TO_TRAINER) violated - parent key not found 02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found" *Cause: A foreign key value has no matching primary key value. *Action: Delete the foreign key or add a matching primary key.
我似乎找不到问题,我以为调用该过程会解除约束。
我做错了什么?
谢谢。
您正在将 TEAMS 中的外键列更新为 TRAINER 中引用的主键中不存在的值。
如果需要 FK 约束,一个简单的修复方法是在 TRAINER 中添加一个 default/dummy 行,其中 CODA 中的值为 0。