Sql server 2012 删除前的MS Sql Server触发器

Sql server 2012 删除前的MS Sql Server触发器,sql-server-2012,Sql Server 2012,我创建了以下触发器 ALTER TRIGGER SystemClearConfiguration ON Systems FOR DELETE AS BEGIN UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId = (SELECT deleted.Id from deleted); UPDATE Configurations SET SenderId = NULL WHERE SenderId = (SELE

我创建了以下触发器

ALTER TRIGGER SystemClearConfiguration
ON Systems
FOR DELETE
AS 
BEGIN
    UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId = (SELECT deleted.Id from deleted);
    UPDATE Configurations SET SenderId = NULL WHERE SenderId = (SELECT deleted.Id from deleted);
END
GO
如果我转到数据库,右键单击系统,然后单击“编辑top 200”,并尝试删除一行,我知道我总是得到关于FK on table配置的错误

我看到的唯一原因是在delete之前触发器没有运行。在Oracle上,我知道您可以明确地说是在之前还是之后,但在SQL上,我找不到这样的选项

编辑1-2016-12-07

注意:数据类型可能不正确

错误


以下触发器对我起了作用:

ALTER TRIGGER SystemClearConfiguration
ON Systems
INSTEAD OF DELETE
AS 
BEGIN
    UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId IN (SELECT deleted.Id from deleted);
    UPDATE Configurations SET SenderId = NULL WHERE SenderId IN (SELECT deleted.Id from deleted);
    DELETE Systems WHERE Id IN (SELECT deleted.Id from deleted);
END
GO

以下触发器对我起了作用:

ALTER TRIGGER SystemClearConfiguration
ON Systems
INSTEAD OF DELETE
AS 
BEGIN
    UPDATE Configurations SET ReceiverId = NULL WHERE ReceiverId IN (SELECT deleted.Id from deleted);
    UPDATE Configurations SET SenderId = NULL WHERE SenderId IN (SELECT deleted.Id from deleted);
    DELETE Systems WHERE Id IN (SELECT deleted.Id from deleted);
END
GO

你能提供完整的错误信息吗?也许你也可以给我们看一下你的表结构,包括键列?Hello@Tyron78,我刚刚添加了你要求的信息。从你的触发器的错误判断,原因很简单:NULL不是有效的ReceiverId。。。这就是FK坠毁的原因。您可能希望定义一个ID为-1、名称为“Unassigned”的虚拟系统条目,并使用它来代替NULL update.Hello@Tyron78。有一阵子,我觉得我真的很傻,因为我忘记了字段不能为空之类的事情,但事实并非如此哦,好的。奇怪。我想到的另一件事是,您应该将“where ID=”更改为“where ID IN”,因为触发器在每个语句中执行一次,而不是每行执行一次。。。但我怀疑这能否解决眼前的问题。我将尝试模拟这种情况,并尽快提供解决方案。您能提供完整的错误消息吗?也许你也可以给我们看一下你的表结构,包括键列?Hello@Tyron78,我刚刚添加了你要求的信息。从你的触发器的错误判断,原因很简单:NULL不是有效的ReceiverId。。。这就是FK坠毁的原因。您可能希望定义一个ID为-1、名称为“Unassigned”的虚拟系统条目,并使用它来代替NULL update.Hello@Tyron78。有一阵子,我觉得我真的很傻,因为我忘记了字段不能为空之类的事情,但事实并非如此哦,好的。奇怪。我想到的另一件事是,您应该将“where ID=”更改为“where ID IN”,因为触发器在每个语句中执行一次,而不是每行执行一次。。。但我怀疑这能否解决眼前的问题。我将尝试模拟情况,并尽快给出解决方案。谢谢@Tyron78。很遗憾,我们不能像oracle那样访问新旧值。是的,SQL Server有点不同。但是“插入”和“删除”在大多数情况下都做得很好。谢谢@Tyron78。很遗憾,我们不能像oracle那样访问新旧值。是的,SQL Server有点不同。但是“插入”和“删除”在大多数情况下都做得很好。