Я только что ответил другой вопрос , где этот вопрос был связан как дубликат. Я думаю, что здесь тоже стоит разместить мой ответ:
Это невозможно. Вы можете решить это с INSTEAD OF TRIGGER
create table locations
(
id int identity(1, 1),
name varchar(255) not null,
parent_id int,
constraint pk__locations
primary key clustered (id)
)
GO
INSERT INTO locations(name,parent_id) VALUES
('world',null)
,('Europe',1)
,('Asia',1)
,('France',2)
,('Paris',4)
,('Lyon',4);
GO
- Этот триггер будет использовать рекурсивный CTE для получения всех идентификаторов, следующих за всеми идентификаторами, которые вы удаляете. Эти идентификаторы удалены.
CREATE TRIGGER dbo.DeleteCascadeLocations ON locations
INSTEAD OF DELETE
AS
BEGIN
WITH recCTE AS
(
SELECT id,parent_id
FROM deleted
UNION ALL
SELECT nxt.id,nxt.parent_id
FROM recCTE AS prv
INNER JOIN locations AS nxt ON nxt.parent_id=prv.id
)
DELETE FROM locations WHERE id IN(SELECT id FROM recCTE);
END
GO
- Протестируйте здесь, попробуйте с разными идентификаторами. Вы можете попробовать WHERE id IN(4,3)
также ...
SELECT * FROM locations;
DELETE FROM locations WHERE id=4;
SELECT * FROM locations
GO
- Очистка (осторожно с реальными данными!)
if exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME='locations')
---DROP TABLE locations;