在 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_ID
在 EMP
table 中为 2,它会给出完整性约束违规错误 parent not found。
所以,
- 这是否意味着 Oracle 首先检查完整性约束,然后调用 "before update" 触发器?
- 那我们怎样才能绕过这个检查并在更新触发之前调用呢?
- 这里的 "before update" 到底是什么意思?
- 如何通过使用触发器而不是使用显式 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
.
的逻辑
我想了解触发更新前的含义。
我有一个名为 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_ID
在 EMP
table 中为 2,它会给出完整性约束违规错误 parent not found。
所以,
- 这是否意味着 Oracle 首先检查完整性约束,然后调用 "before update" 触发器?
- 那我们怎样才能绕过这个检查并在更新触发之前调用呢?
- 这里的 "before update" 到底是什么意思?
- 如何通过使用触发器而不是使用显式 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
.