2016-03-18 3 views
0

Я создал триггер для обновления строк в другой таблице, вызванный оператором обновления в dbo.update. Причина, по которой этот триггер не срабатывает, вероятно, потому, что он пытается обновить более 1 записи. Я пытаюсь изменить это, но без результата. Мне интересно: как правильно это сделать?Подзапрос возвратил более одного значения на триггере

CREATE TRIGGER 
    [dbo].[Update] 
ON 
    [dbo].[Records] 
FOR UPDATE 
AS 
    BEGIN 
    SET NOCOUNT ON 
     IF (SELECT State FROM INSERTED) = '1' 
     Begin 
     UPDATE dbo.Issue SET state = 1 WHERE EventID = (SELECT EventID FROM INSERTED) 

     DECLARE @IssueID INT 
     SET @issueID = (SELECT IssueID FROM Issue WHERE EventID = (SELECT EventID FROM INSERTED)) 
     UPDATE dbo.Action SET state = 1 WHERE IssueID = @issueID 

    end 
     IF (SELECT State FROM INSERTED) = '0' 
     Begin 
     UPDATE dbo.Issue SET state = 0 WHERE EventID = (SELECT EventID FROM INSERTED) 

     SET @issueID = (SELECT IssueID FROM Issue WHERE EventID = (SELECT EventID FROM INSERTED)) 
     UPDATE dbo.Action SET state = 0 WHERE IssueID = @issueID 

    end 
END 
+0

'IF (SELECT State FROM INSERTED) = '1'' ... Используйте курсор для чтения таблицы. – jarlh

ответ

2

Вы правы в диагностике. Я думаю, что вы хотите, чтобы заменить весь if с двумя update с использованием join с до inserted:

UPDATE i 
    SET state = ii.state 
    FROM dbo.Issue i JOIN 
     inserted ii 
     ON i.EventID = ii.EventID 
    WHERE ii.state IN (0, 1); 

UPDATE a 
    SET state = ii.state 
    FROM dbo.Action a JOIN 
     dbo.Issue i 
     ON a.EventId = i.EventId JOIN 
     inserted ii 
     ON a.IssueId = ii.IssueId 
    WHERE ii.state IN (0, 1); 
+0

Этот запрос работает – TheGameiswar

0

Ваше обновление будет работать только тогда, когда есть только одна запись обновляется. Если в пакете/транзакции есть несколько записей, то INSERTED будет иметь несколько записей в нем, и именно тогда ваш код выйдет из строя. Вы можете попробовать следующий запрос:

UPDATE dbo.Issue 
SET state = INSERTED.State 
FROM 
INSERTED 
WHERE dbo.Issue.EventId = INSERTED.EventId 
AND INSERTED.State in (0, 1) 

UPDATE dbo.Action 
SET State = INSERTED.State 
FROM 
INSERTED 
JOIN Issue on INSERTED.EventID = Issue.EventID 
WHERE 
INSERTED.State in (0,1) 
+0

Это похоже на предыдущий ответ. –

Смежные вопросы