Triggers 无法将空值插入列错误
我有一个问题,我想更新表中的一列,并使用触发器更新另一个表中的同一列。它说我不能插入NULL,但我似乎无法理解它从哪里得到NULL值。这是触发因素:Triggers 无法将空值插入列错误,triggers,sql-server-2008-r2,null,Triggers,Sql Server 2008 R2,Null,我有一个问题,我想更新表中的一列,并使用触发器更新另一个表中的同一列。它说我不能插入NULL,但我似乎无法理解它从哪里得到NULL值。这是触发因素: CREATE TRIGGER Custom_WF_Update_WF_DefinitionSteps_DefinitionId ON WF.Definition AFTER UPDATE AS BEGIN IF UPDATE(DefinitionId) IF TRIGGER_NESTLEVEL() < 2 BEGIN ALTE
CREATE TRIGGER Custom_WF_Update_WF_DefinitionSteps_DefinitionId ON WF.Definition
AFTER UPDATE AS BEGIN
IF UPDATE(DefinitionId)
IF TRIGGER_NESTLEVEL() < 2
BEGIN
ALTER TABLE WF.DefinitionSteps NOCHECK CONSTRAINT ALL
UPDATE WF.DefinitionSteps
SET DefinitionId =
(SELECT i.DefinitionId
FROM inserted i,
deleted d
WHERE WF.DefinitionSteps.DefinitionId = d.DefinitionId
AND i.oldPkCol = d.DefinitionId)
WHERE WF.DefinitionSteps.DefinitionId IN
(SELECT DefinitionId FROM deleted)
ALTER TABLE WF.DefinitionSteps CHECK CONSTRAINT ALL
END
END
但这一次失败了:
UPDATE [CCHMergeIntermediate].[WF].[Definition]
SET DefinitionId = target.DefinitionId
FROM [CCHMergeIntermediate].[WF].[Definition] source
INNER JOIN [centralq3].[WF].[Definition] target
ON (((source.Name = target.Name) OR (source.Name IS NULL AND target.Name IS NULL)))
我得到以下错误:
Msg 515,16级,状态2,程序自定义\u WF\u更新\u WF\u定义步骤\u定义ID,第7行
无法将值NULL插入到“定义ID”列、表“CCHMergeIntermediate.WF.DefinitionSteps”中;列不允许空值。更新失败
如果执行select而不是update语句,如下所示:
SELECT source.DefinitionId, target.DefinitionId
FROM [CCHMergeIntermediate].[WF].[Definition] source
INNER JOIN [centralq3].[WF].[Definition] target
ON (((source.Name = target.Name) OR (source.Name IS NULL AND target.Name IS NULL)))
我得到这个结果:
很抱歉外部链接,我没有足够的声誉在这里发布图片
我做错了什么?我看不到什么?我遗漏了什么?问题在于该条件下的触发器。我修改了第二个,其中从I.oldPkCol=d.DefinitionId到I.oldPkCol=**d.oldPkCol**,它成功了
UPDATE WF.DefinitionSteps
SET DefinitionId =
(SELECT i.DefinitionId
FROM inserted i,
deleted d
WHERE WF.DefinitionSteps.DefinitionId = d.DefinitionId
AND i.oldPkCol = **d.oldPkCol**)
WHERE WF.DefinitionSteps.DefinitionId IN
(SELECT DefinitionId FROM deleted)
UPDATE WF.DefinitionSteps
SET DefinitionId =
(SELECT i.DefinitionId
FROM inserted i,
deleted d
WHERE WF.DefinitionSteps.DefinitionId = d.DefinitionId
AND i.oldPkCol = **d.oldPkCol**)
WHERE WF.DefinitionSteps.DefinitionId IN
(SELECT DefinitionId FROM deleted)