执行级联触发器 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
我似乎无法让我的触发器按预期工作,出现错误 "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