假设我的employee
表只有2列:
添加到此表中的所有员工都会有一个manager_id
,其实际上已经存在employee_id
(除了一个,首席执行官可能没有经理,但这并不重要)
如果A
是B
的经理,我们如何执行检查,以便A的经理可以获取任何价值但B
,从而导致违反业务规则?
答案 0 :(得分:0)
我想说最好的方法是在插入表格中创建一个TRIGGER,只需检查manager_id NOT IN (SELECT employee_id from employee where manager_id = %insertid%)
。
答案 1 :(得分:0)
问题比这更深入,您希望避免图中的任何周期,使其成为树。
我认为你最好在应用程序级别这样做。
更新但如果您更喜欢使用触发器,请查看common table expressions (CTEs)。您可以在检查周期的触发器中创建递归查询:
create trigger prevent_management_cycles on employee
instead of update
as
declare @found_rows int
;with cycle_detector (employee_id) as (
select employee_id from inserted
union all
select employee.employee_id from employee
join cycle_detector
on employee.manager_id = cycle_detector.employee_id
)
select @found_rows = count(*)
from cycle_detector
join inserted
on inserted.manager_id = cycle_detector.employee_id
if @found_rows > 0
raiserror('cycle detected!', 1, 1)
else
-- carry on original update
update employee
set employee.manager_id = inserted.manager_id
-- other columns...
from employee
join inserted on employee.employee_id = inserted.employee_id
注意:假设employee_id
是主键,manager_id
是指向employee.employee_id
的外键。
答案 2 :(得分:0)
答案的一半是外键:manager_id引用员工(employee_id)
另一半是检查约束,manager_id<> employee_id