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

Before update trigger with referential integrity in oracle 11g

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

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

另一个 table EMP 有列 EMP_ID 作为主键和 EMP_DEPT_ID 是引用 DEPT_ID 的外键 DEPT table。

现在,如果我在 EMP tables EMP_DEPT_ID 列上添加更新触发器,这将检查主 table 中是否存在 EMP_DEPT_ID 的新值] DEPT if now then will insert new row with new DEPT_ID to DEPT table.

现在,如果我将 EMP_DEPT_ID 更新为 3,其中 EMP_DEPT_IDEMP table 中为 2,它会给出完整性约束违规错误 parent not found。

所以,

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

谢谢

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

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

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

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

将约束定义为可延迟的另一种方法是将 emp table 重命名为 emp_base,创建一个名为 emp 的视图,然后在 emp 上创建一个 instead of insert 触发器,实现先插入 dept 然后插入 emp_base.

的逻辑