当我一次又一次用相同的值更新表时会发生什么?

时间:2018-07-06 11:29:46

标签: sql sql-server database triggers updates

当我一次又一次用相同的值更新表时会发生什么? 例如:

  

更新tblExample设置Col1 = 1214,其中Id = 17

让我们假设我用相同的值不断更新此记录,而无需更改任何列。 执行将如何发生? 在更新后触发器中执行此操作会发生什么?

1 个答案:

答案 0 :(得分:1)

如果您运行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上有一个触发器,它仍然会触发,并执行通常会执行的任何操作。如果您不希望这样做,则需要对照inserteddeleted中的列的值进行检查,以了解它们是否不同。

为进一步扩展,这是一个带有触发器的小演示(请注意,通常有一个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;