sql检查2列中的逻辑错误

时间:2011-07-05 17:07:59

标签: sql sql-server sql-server-2008 database-design data-modeling

假设我的employee表只有2列:

  • EMPLOYEE_ID
  • MANAGER_ID

添加到此表中的所有员工都会有一个manager_id,其实际上已经存在employee_id(除了一个,首席执行官可能没有经理,但这并不重要)

如果AB的经理,我们如何执行检查,以便A的经理可以获取任何价值但B,从而导致违反业务规则?

3 个答案:

答案 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