您可以
CHECK CONSTRAINT通过验证管理员ID不是周期来执行此操作。检查约束中不能包含复杂的查询,但是如果首先将其包装在函数中,则可以:
create function CheckManagerCycle( @managerID int )returns intasbegin declare @cycleExists bit set @cycleExists = 0 ;with cte as ( select E.* from tblEmployee E where ID = @managerID union all select E.* from tblEmployee E join cte on cte.ManagerID = E.ID and E.ID <> @managerID ) select @cycleExists = count(*) from cte E where E.ManagerID = @managerID return @cycleExists;end
然后,您可以使用如下约束:
alter table tblEmployeeADD ConSTRAINT chkManagerRecursive CHECK ( dbo.CheckManagerCycle(ManagerID) = 0 )
这将防止添加或更新记录以从任何来源创建循环。
编辑:
一个重要的注意事项:检查约束在它们引用的列上得到验证。我最初将其编码为检查员工ID而不是经理ID的周期。但是,这不起作用,因为它仅在对ID列进行更改时触发。该版本之所以起作用,是因为它在
ManagerID更改时会被触发。



