Что произойдет, когда я обновлю таблицу с теми же значениями снова и снова? - PullRequest
0 голосов
/ 06 июля 2018

Что произойдет, когда я обновлю таблицу с теми же значениями снова и снова? Пример:

update tblExample set Col1 = 1214, где Id = 17

Давайте предположим, что я продолжаю обновлять эту запись с тем же значением без изменения каких-либо столбцов. как будет казнь? Что произойдет, когда мы сделаем это в После обновления триггер?

1 Ответ

0 голосов
/ 06 июля 2018

Если вы запустите оператор UPDATE, этот оператор UPDATE будет выполнен (неожиданно), даже если значения, для которых вы устанавливаете столбцы, совпадают. Например:

CREATE TABLE dbo.test (ID int, SomeString varchar(10));

INSERT INTO dbo.test
VALUES(1,'abc'),
      (2,'def');
GO
--Will return 1 row updated
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO
--Will return 1 row updated
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO

Когда вы запускаете эти UPDATE оценки, значение SomeString все еще устанавливается. Следовательно, если у вас есть триггер на UPDATE для этой таблицы, он все равно будет сработать и делать все, что он будет делать в обычном режиме. Если вы этого не хотите, вам нужно проверить значения столбцов в inserted и deleted, чтобы увидеть, отличаются ли они.

Для дальнейшего расширения приведем небольшую демонстрацию с триггером (обратите внимание, что обычно наличие оператора SELECT, возвращающего набор данных в триггере, является некорректным и (если я правильно помню) был устаревшей функцией в SQL Server 2017 ).

CREATE TRIGGER dbo.test_trg ON dbo.test
AFTER UPDATE AS

    SELECT *
    FROM inserted; --SELECTs in triggers are bad!

GO
--Will perform the SELECT in the trigger
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
GO
--Instead, check is the value is different
ALTER TRIGGER dbo.test_trg ON dbo.test
AFTER UPDATE AS

    SELECT i.*
    FROM inserted i
         JOIN deleted d ON i.ID = d.ID
    WHERE i.SomeString != d.SomeString; --SELECTs in triggers are bad!

GO
--Won't return any rows
UPDATE dbo.test
SET SomeString = 'abc'
WHERE ID = 1;
--Will return a row
UPDATE dbo.test
SET SomeString = 'bcd'
WHERE ID = 1;
GO
--Cleanup
DROP TABLE dbo.test;
...