Как бороться с обновлением ПК в ON INSTEAD OF UPDATE Trigger - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь создать триггер INSTEAD OF UPDATE, который изменяет один из вставляемых столбцов перед выполнением вставки.Работает нормально, если PK таблицы не изменился во время обновления.

Если обновляется PK таблицы, я не знаю, как написать оператор обновления для обновления соответствующих строк.Как узнать, какие строки нужно обновить.

CREATE Table MyTest(ID int NOT NULL PRIMARY KEY,
                    Name NVARCHAR(40) NOT NULL);
GO

INSERT INTO MyTest VALUES(1,'Joe');
INSERT INTO MyTest VALUES(2,'Scott');
INSERT INTO MyTest VALUES(3,'Dan');
INSERT INTO MyTest VALUES(4,'Becky');

GO

CREATE TRIGGER Update_Please
ON MyTest
INSTEAD OF UPDATE
AS
BEGIN
    SET NOCOUNT ON

    IF EXISTS (SELECT id  
                 FROM INSERTED 
               EXCEPT 
               SELECT id
                 FROM DELETED)
        RAISERROR ('now what?',-1,-1);
        /* ======================================================
           oh heck! The PK in one or more rows was updated 
           in the update statement. How do I construct
           an update statement w/o joining to inserted on the PK?
           ====================================================== */

    ELSE
        BEGIN
            -- ALTER A COLUMN
            UPDATE M
               SET name = CASE WHEN I.NAME = 'Mike' THEN 'The Dude' ELSE  I.NAME END
              FROM MyTest M
              JOIN INSERTED I ON I.id = M.id;
        END
END

GO

UPDATE MyTest SET Name = 'Mike' WHERE id > 2; --works great!

UPDATE MyTest SET ID = 9 WHERE Name = 'Joe'; --how do I complete the update?

1 Ответ

0 голосов
/ 02 октября 2018

Как я писал в своем комментарии, я не думаю, что вы можете сделать это с помощью триггера instead of update, однако это довольно легко сделать с помощью for update.Причина заключается в разнице между двумя триггерами - триггер instead of update срабатывает до базовой таблицы обновляется, а триггер for update срабатывает после этого.Это означает, что все значения, которые вы имеете в своей таблице inserted, являются теми же значениями, что и в вашей фактической таблице, поэтому просто измените триггер с instead of update на for update:

CREATE TRIGGER Update_Please
ON MyTest
FOR UPDATE
AS
BEGIN
    SET NOCOUNT ON
        UPDATE M
           SET name = CASE WHEN I.NAME = 'Mike' THEN 'The Dude' ELSE  I.NAME END
          FROM MyTest M
          JOIN INSERTED I ON I.id = M.id;

END

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...