I'm looking to create a trigger where after data is either inserted or updated on Table A, if certain criteria is met, an update will happen to a pre-existing record on Table B.
Table A
| TableAId | PersonId | Year | Quarter | Food | Color | Comment |
|---|---|---|---|---|---|---|
| 1 | Joe | 2022 | 4 | Apple | Red | null |
| 2 | Joe | 2022 | 4 | Carrot | Orange | Yummy |
| 3 | Bill | 2022 | 4 | Celery | null | null |
| 4 | Bill | 2022 | 4 | Apple | Green | Yucky |
Table B
| TableBId | PersonId | Year | Quarter | Responded |
|---|---|---|---|---|
| 1 | Joe | 2021 | 3 | Yes |
| 2 | Joe | 2022 | 4 | Yes |
| 3 | Bill | 2022 | 2 | Yes |
| 4 | Bill | 2022 | 4 | Yes |
In verbal logic, the way I want this to work is if there is a record inserted or updated in Table A where Comment is null and Color is not null, I want to update the Table B Responded field to null where the corresponding PersonId, Year and Quarter are equal.
In this specific case, if the 4 records were inserted into Table A, TableAId of 1 would meet the criteria of setting off the trigger because it is the only instance where Comment is null and Color is not null. What would then need to happen on Table B is we would find the corresponding record of Joe/2022/4 (PersonId/Year/Quarter) which in this case is TableBId of 2. We would then change the Responded field to null.
In pseudo code:
After Insert Into Table A
IF(Any inserted rows contain Comment = null AND color != null)
THEN Update Table B
SET TableB.Responded = null
WHERE TableA.PersonId = TableB.PersonId AND TableA.Year=TableB.Year AND TableA.Quarter = TableB.Quarter
CodePudding user response:
These should do the trick:
CREATE TRIGGER UpdateTableBBasedOnInsert
ON dbo.TableA
AFTER INSERT
AS
BEGIN
UPDATE b
SET b.Responded=NULL
FROM TableB b
JOIN inserted i
on i.PersonId=b.PersonId AND i.Year=b.Year AND b.Quarter=i.Quarter
WHERE i.Comment IS NULL AND i.Color IS NOT NULL
END
CREATE TRIGGER UpdateTableBBasedOnUpdate
ON dbo.TableA
FOR UPDATE
AS
BEGIN
UPDATE b
SET b.Responded=NULL
FROM TableB b
JOIN inserted i
on i.PersonId=b.PersonId AND i.Year=b.Year AND b.Quarter=i.Quarter
WHERE i.Comment IS NULL AND i.Color IS NOT NULL
END
EDIT: As Dale pointed out, these can be combined into a single trigger:
CREATE TRIGGER UpdateRows
ON dbo.TableA
FOR INSERT, UPDATE
AS
BEGIN
UPDATE b
SET b.Responded=NULL
FROM TableB b
JOIN inserted i
on i.PersonId=b.PersonId AND i.Year=b.Year AND b.Quarter=i.Quarter
WHERE i.Comment IS NULL AND i.Color IS NOT NULL
END
