2014-10-20 5 views
0

У меня проблема, когда я хочу обновить столбец в таблице и с помощью триггера для обновления одного и того же столбца, но в другой таблице. Он говорит, что я не могу вставить 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 
    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 = source.DefinitionId + 445 
FROM [CCHMergeIntermediate].[WF].[Definition] source 

Но это терпит неудачу:

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, Level 16, State 2, Procedure Custom_WF_Update_WF_DefinitionSteps_DefinitionId, Line 7
Cannot insert the value NULL into column 'DefinitionId', table 'CCHMergeIntermediate.WF.DefinitionSteps'; column does not allow nulls. UPDATE fails.

Если я сделаю выбор вместо обновления поел заявление, как это:

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))) 

Я получаю этот результат: http://i.stack.imgur.com/3cZsM.png (извините за внешнюю ссылку, я не имею enaugh репутацию размещать изображение здесь)

Что я делаю неправильно? Что я не вижу? Что мне не хватает ..?

ответ

0

Проблема была в триггере при условии. Я изменил второй, где от 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) 
Смежные вопросы