У меня есть следующая таблица:
if object_id(N'dbo.Node') is null
create table dbo.Node
(
ID bigint identity primary key,
ParentID bigint null, -- references Node(ID)
DateCreated datetime not null,
LastUpdated datetime not null,
[Name] nvarchar(500) not null,
);
У меня есть этот триггер для каскадного удаления в той же таблице:
create trigger Node_Delete on Node for delete
as
begin
delete from Node where ParentID in (select id from deleted)
end
Вот мой набор данных:
ID ParentID DateCreated LastUpdated Name
534 514 2010-01-12 10:15:03.940 2010-01-12 10:15:03.940 Test 1
535 534 2010-01-12 10:15:08.563 2010-01-12 10:15:08.563 Test 2
536 535 2010-01-12 10:15:12.063 2010-01-12 10:15:12.063 Test 3
537 536 2010-01-12 10:15:18.510 2010-01-12 10:15:18.510 Test 4
Теперь я выполняю этот запрос:
delete from Node where ID=534
И это результирующий набор данных:
ID ParentID DateCreated LastUpdated Name
536 535 2010-01-12 10:15:12.063 2010-01-12 10:15:12.063 Test 3
537 536 2010-01-12 10:15:18.510 2010-01-12 10:15:18.510 Test 4
Почему оператор DELETE в триггере не вызывает рекурсивное выполнение триггера, пока не будут удалены все дочерние записи?
РЕДАКТИРОВАТЬ: обратите внимание, что я разместил рабочее решение ниже, но пометил другой ответ как правильный, так как мой вопрос был не "каково решение", а скорее "почему мой метод не работает ».