【发布时间】:2015-06-24 20:42:39
【问题描述】:
我想像这样制作 INSTEAD OF 触发器:
CREATE TRIGGER [dbo].[DeleteCompany]
ON [dbo].[Company]
INSTEAD OF DELETE
AS
DECLARE @CompanyID int
SELECT @CompanyID = deleted.CompanyID FROM deleted
BEGIN TRAN
DELETE FROM Project WHERE CompanyID = @CompanyID
DELETE FROM CompanyPerson WHERE CompanyID = @CompanyID
UPDATE PersonCompany SET CompanyID = null WHERE CompanyID = @CompanyID
DELETE [Company]
FROM DELETED D
INNER JOIN [Company] T ON T.CompanyID = D.CompanyID
COMMIT TRAN
所以,我可以肯定,这些动作是一种原子动作。但这有意义还是 TRIGGER 总是在事务内部执行?
另外,如果公司将在另一个 TRIGGER 中被删除,会发生什么情况:
CREATE TRIGGER [dbo].[DeleteSecurityLevel]
ON [dbo].[SecurityLevel]
INSTEAD OF DELETE
AS
DECLARE @SecurityLevelID int
SELECT @SecurityLevelID = deleted.SecurityLevelID FROM deleted
BEGIN TRAN
DELETE FROM Company WHERE SecurityLevelId = @SecurityLevelID
DELETE FROM CompanyRole WHERE SecurityLevelId = @SecurityLevelID
....
DELETE SecurityLevel
FROM DELETED D
INNER JOIN SecurityLevel T ON T.SecurityLevelID = D.SecurityLevelID
COMMIT TRAN
所以,触发器 DeleteSecurityLevel 正在删除 Company 并调用 DeleteCompany 触发器。如果每个触发器都有 BEGIN/COMMIT TRAM ,它将在一个事务中?如果每个触发器都没有?
PS。我无法设置“CASCADE DELETE”,因为 DB 有一些类似的关系:
所以,尝试设置 CASCADE DELETE 会抛出类似的错误:
在表上引入 FOREIGN KEY 约束“FK_Persons_Areas” “人”可能会导致循环或多个级联路径。指定开 DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。见上 错误。
【问题讨论】:
标签: sql-server triggers azure-sql-database sql-server-2014