如何在 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。