执行级联触发器 returns 错误 "Subquery returned more than 1 value. This is not permitted"

Executing cascading triggers returns error "Subquery returned more than 1 value. This is not permitted"

我似乎无法让我的触发器按预期工作,出现错误 "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the subquery is used as an expression"

我创建了几个触发器来实现级联删除效果。我正在使用 EF,但我无法使用它的级联删除功能,因为我的数据库中有多个删除路径。

反正每次我删除一个公司并因此执行DeleteCompany触发器时,我都会得到上面的错误。我尝试取出一些我认为是错误原因的触发器,但我每次都得到它。

这是我的触发器:

CREATE TRIGGER DeleteCompany 
    ON [dbo].[CompanySet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[EmployeeSet]
    WHERE CompanyId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[TemplateSet]
    WHERE CompanyId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[SettingSet]
    WHERE CompanyId = (SELECT Id FROM deleted) AND EmployeeId = NULL

    DELETE FROM [dbo].[CustomerSet]
    WHERE CompanyId = (SELECT Id FROM deleted)
GO

CREATE TRIGGER DeleteEmployee 
    ON [dbo].[EmployeeSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[SettingSet]
    WHERE EmployeeId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[FavoriteSet]
    WHERE EmployeeId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[ProjectEmployeeSet]
    WHERE EmployeeId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[ActivityBaseSet]
    WHERE EmployeeId = (SELECT Id FROM deleted)

    DELETE FROM [dbo].[ActivityReportSet]
    WHERE EmployeeId = (SELECT Id FROM deleted)
GO

CREATE TRIGGER DeleteRole
    ON [dbo].[RoleSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[AccountRoleSet]
    WHERE RolesId = (SELECT Id FROM deleted)    
GO

CREATE TRIGGER DeleteCustomer
    ON [dbo].[CustomerSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[ProjectSet]
    WHERE CustomerId = (SELECT Id FROM deleted) 
GO

CREATE TRIGGER DeleteProject
    ON [dbo].[ProjectSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[TemplateSet]
    WHERE ProjectId = (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[ActivityBaseSet_Activity]
    WHERE ProjectId = (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[ActivityReportSet]
    WHERE ProjectId = (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[FavoriteSet]
    WHERE ProjectId = (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[ProjectEmployeeSet]
    WHERE ProjectId = (SELECT Id FROM deleted)  
GO

CREATE TRIGGER DeleteSettingDefinition
    ON [dbo].[SettingDefinitionSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[SettingSet]
    WHERE SettingDefinitionId = (SELECT Id FROM deleted)    
GO

CREATE TRIGGER DeleteTemplate
    ON [dbo].[TemplateSet]
    INSTEAD OF DELETE
AS
    UPDATE [dbo].[ActivityReportSet] SET [dbo].[ActivityReportSet].TemplateId = NULL
    FROM deleted
    WHERE [dbo].[ActivityReportSet].TemplateId = deleted.Id
GO

我是不是漏掉了什么?

你能用 "IN" 运算符替换你所有的“=”吗?像这样的子查询:

DELETE FROM [dbo].[EmployeeSet]
    WHERE CompanyId IN (SELECT Id FROM deleted)

请尝试使用以下查询

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

    DELETE FROM [dbo].[TemplateSet]
    WHERE CompanyId IN (SELECT Id FROM deleted)

    DELETE FROM [dbo].[SettingSet]
    WHERE CompanyId IN (SELECT Id FROM deleted) AND EmployeeId IS NULL

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

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

    DELETE FROM [dbo].[FavoriteSet]
    WHERE EmployeeId IN (SELECT Id FROM deleted)

    DELETE FROM [dbo].[ProjectEmployeeSet]
    WHERE EmployeeId IN (SELECT Id FROM deleted)

    DELETE FROM [dbo].[ActivityBaseSet]
    WHERE EmployeeId IN (SELECT Id FROM deleted)

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

CREATE TRIGGER DeleteRole
    ON [dbo].[RoleSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[AccountRoleSet]
    WHERE RolesId IN (SELECT Id FROM deleted)    
GO

CREATE TRIGGER DeleteCustomer
    ON [dbo].[CustomerSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[ProjectSet]
    WHERE CustomerId IN (SELECT Id FROM deleted) 
GO

CREATE TRIGGER DeleteProject
    ON [dbo].[ProjectSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[TemplateSet]
    WHERE ProjectId IN (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[ActivityBaseSet_Activity]
    WHERE ProjectId IN (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[ActivityReportSet]
    WHERE ProjectId IN (SELECT Id FROM deleted)  

    DELETE FROM [dbo].[FavoriteSet]
    WHERE ProjectId IN (SELECT Id FROM deleted)  

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

CREATE TRIGGER DeleteSettingDefinition
    ON [dbo].[SettingDefinitionSet]
    INSTEAD OF DELETE
AS
    DELETE FROM [dbo].[SettingSet]
    WHERE SettingDefinitionId IN (SELECT Id FROM deleted)    
GO

CREATE TRIGGER DeleteTemplate
    ON [dbo].[TemplateSet]
    INSTEAD OF DELETE
AS
    UPDATE [dbo].[ActivityReportSet] SET [dbo].[ActivityReportSet].TemplateId = NULL
    FROM deleted
    WHERE [dbo].[ActivityReportSet].TemplateId = deleted.Id
GO