如何在PL / SQL中删除触发器中的约束?

时间:2016-05-09 14:43:00

标签: oracle plsql oracle-sqldeveloper

我正在为实际目的编写一个数据库,目前涉及一些触发器和约束。

我的一个触发器必须在删除指定的行之前将列值设置为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) - 未找到父密钥”   *原因:外键值没有匹配的主键值。   *操作:删除外键或添加匹配的主键。

我似乎无法找到问题,我认为调用该过程将删除约束。

我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

您正在将TEAMS中的外键列更新为TRAINER中引用的主键中不存在的值。

如果需要FK约束,一个简单的修复就是在TRAINER中添加默认/虚拟行,其中CODA中的值为0.