Триггеры вызывают выполнение других триггеров?
У меня есть вопрос относительно триггеров в 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
Это делает трюк, и желаемый эффект каскадного удаления достигается.
Это пост, который привел меня к этой реализации: Ссылка