0

我想了解触发器中更新前的含义。

我有一个名为DEPT_MSTwhere DEPT_IDis the primary key 的表。它有 2 行,DEPT_ID1 和 2。

另一个表EMP有列EMP_ID作为主键,它是表EMP_DEPT_ID的外键引用。DEPT_IDDEPT

EMP现在,如果我在表列上添加更新前触发器EMP_DEPT_ID,它将检查EMP_DEPT_ID主表中是否存在新值,DEPT如果现在将插入新行和DEPT_ID表中的新行DEPT

现在,如果我更新EMP_DEPT_ID到 3 其中表中EMP_DEPT_ID的 2EMP给出完整性约束违规错误父未找到。

所以,

  1. 这是否意味着Oracle首先检查完整性约束,然后调用“更新前”触发器?
  2. 那么我们如何绕过这个检查并在更新触发器之前调用呢?
  3. 这里的“更新前”到底是什么意思?
  4. 如何通过使用触发器而不是使用显式 PL SQL 块来实现上述结果?

谢谢

4

1 回答 1

1

在调用触发器之前评估非延迟外键约束,是的。

如果您可以将外键约束声明为可延迟(如果现有约束不可延迟,则需要删除并重新创建它)

ALTER TABLE emp
  ADD CONSTRAINT fk_emp_dept (emp_dept_id) REFERENCES dept( dept_id )
  INITIALLY DEFERRED DEFERRABLE;

然后,在您的应用程序中,您可以将约束设置为可延迟,运行您的INSERT语句导致触发器触发并插入父行。事务提交时将验证您的外键约束。

将约束定义为可延迟的另一种方法是将emp表重命名为,例如emp_base,创建一个名为的视图emp,然后在其上创建一个instead of insert触发器,emp该触发器实现了首先插入dept然后插入的逻辑emp_base

于 2015-03-20T19:45:01.140 回答