2016-05-25 33 views
0

我似乎無法讓我的觸發器正常工作,我得到的錯誤「Subquery返回的值超過1。當子查詢遵循=,!=,<,<,< =,>,> =或當子查詢用作表達式「執行級聯觸發器返回錯誤「子查詢返回的值超過1,這是不允許的」

時允許我創建了幾個用於實現級聯刪除效果的觸發器。我使用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 

我失去了一些東西在這裏?

回答

1

可以更換所有的「=」和「IN」操作符爲你的子查詢:

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

雖然我仍然有一些未刪除實體由於某種原因,在我的EmployeeSet和CustomerSet表中,這看起來有伎倆,只要第二個問題不在於IN關鍵字的用法。 – LeonidasFett

1

請嘗試使用下面的查詢

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 
相關問題