Reputation: 1411
I created a trigger to update rows in another table, triggered by a update statement in dbo.update
. The reason why this trigger fails is probably because it tries to update more than 1 record. I try to change this, but without result. I'm wondering: what is the correct way to do this?
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
Upvotes: 0
Views: 153
Reputation: 950
Your update will only work when there is only one record updated. If there are multiple records updated in a batch/transaction, then INSERTED will have multiple records in it and that's when your code will error out. You can try the below query:
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)
Upvotes: 0
Reputation: 1269643
You are correct on the diagnosis. I think you want to replace the entire if
with two update
s using join
s to 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);
Upvotes: 2