在oracle 11g中使用引用完整性更新触发器之前

时间:2015-03-20 19:13:13

标签: triggers oracle11g onbeforeunload referential-integrity beforeupdate

我想了解触发器更新前的内容。

我有一个名为DEPT_MST的表,其中DEPT_ID是主键。它有2行,DEPT_ID 1和2。

另一个表EMP将列EMP_ID作为主键,EMP_DEPT_ID是引用DEPT_ID表的DEPT的外键。

现在,如果我在EMPEMP_DEPT_ID列之前添加更新触发器,这将检查主表EMP_DEPT_ID中是否存在DEPT的新值,如果现在将插入新行DEPT_IDDEPT表的新行。

现在,如果我将EMP_DEPT_ID更新为3,EMP_DEPT_ID表中的EMP为2,则表示未找到父级的完整性约束违规错误。

所以,

  1. 这是否意味着Oracle首先检查完整性约束,然后在更新之前调用""触发?
  2. 那么我们如何绕过此检查并在更新触发器之前调用?
  3. 更新前的确切内容""这意味着什么?
  4. 如何通过使用触发器而不是使用显式PL SQL块来实现上述结果?
  5. 谢谢

1 个答案:

答案 0 :(得分: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的逻辑。