Проблема еще глубже, вам нужно избегать любых циклов в вашем графике , что делает его деревом .
Я думаю, вам лучше делать это на уровне приложений.
ОБНОВЛЕНИЕ: Но если вы предпочитаете делать это с помощью триггера, взгляните на общие табличные выражения (CTE) . Вы можете создать рекурсивный запрос в триггере, который проверяет циклы:
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
.