使用触发器进行约束

ind*_*ent 1 sql oracle

我使用三个表 - 订单,员工和职位.订单有Employee_no,Employee表有Position_no.我想确保Order表中的Employee_Nos是Sales中那些员工的编号.销售中员工的Position_no是3,4,5,6.我使用查询1(见下文)添加检查约束.但是,它不喜欢子查询.我可以使用查询2(见下文),它确保Orders表中的Employee_No在列表中(列表是销售中员工的员工数).但是,如果新员工加入,则查询2将不起作用.我知道这可以使用触发器解决,但不知道如何.如果有人可以帮助我,我会很高兴的.

Ole*_*liv 5

在你的情况下我不会使用触发器.它们很难处理,您需要知道如何正确管理它们.

考虑以下解决方案.

create materialized view check_sales
refresh complete on commit as
select 1 dummy
from ORDERS where 
EMPLOYEE_NO IS NOT IN ( SELECT EMPLOYEE_NO FROM EMPLOYEE WHERE POSITION IN (3,4,5,6))

alter table check_sales
add constraint check_sales_empty
check (1=0) deferrable;
Run Code Online (Sandbox Code Playgroud)

我现在没有Oracle来测试我的解决方案,但我认为你有了这个想法.您选择了不正确的订单check_sales并添加了一个应该为空的约束.