Триггеры вызывают выполнение других триггеров?

У меня есть вопрос относительно триггеров в TSQL.

Допустим, у меня есть 3 таблицы:

Companies
---------
Id

Employees
---------
Id
CompanyId

Tasks
-----
EmployeeId

Теперь я создаю 2 триггера для 2 верхних таблиц Companies а также Employees:

CREATE TRIGGER DeleteCompany
    ON [dbo].[Companies]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[Employees]
    WHERE CompanyId IN (SELECT Id FROM deleted)     
GO

CREATE TRIGGER DeleteEmployee
    ON [dbo].[Employees]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[Tasks]
    WHERE EmployeeId IN (SELECT Id FROM deleted)        
GO

Все идет нормально. Теперь, если я удалю компанию, триггер DeleteCompany будет выполнен и сопоставлен Employees будут удалены Мой вопрос, это вызовет триггер DeleteEmployee выполнить? Потому что я пытаюсь сделать это в основном, но выполняется только первый триггер (DeleteCompany).

1 ответ

Решение

ОК, я нашел проблему. Я был немного смущен тем, что INSTEAD OF на самом деле Оказывается, он полностью заменяет УДАЛИТЬ, поэтому мне пришлось удалить фактическую запись после того, как я удалил ее ссылки следующим образом:

CREATE TRIGGER DeleteCompany
    ON [dbo].[Companies]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[Employees]
    WHERE CompanyId IN (SELECT Id FROM deleted)  

    DELETE [dbo].[Companies] WHERE [dbo].[Companies].Id IN (SELECT Id FROM deleted)   
GO

CREATE TRIGGER DeleteEmployee
    ON [dbo].[Employees]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[Tasks]
    WHERE EmployeeId IN (SELECT Id FROM deleted) 

    DELETE [dbo].[Employees] WHERE [dbo].[Employees].Id IN (SELECT Id FROM deleted)            
GO

Это делает трюк, и желаемый эффект каскадного удаления достигается.

Это пост, который привел меня к этой реализации: Ссылка

Другие вопросы по тегам