【问题标题】:What will happen when i update table with same values again and again?当我一次又一次地用相同的值更新表时会发生什么?
【发布时间】:2018-07-06 11:29:46
【问题描述】:

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

更新 tblExample set Col1 =1214 where Id=17

假设我在不更改任何列的情况下继续使用相同的值更新此记录。 执行将如何发生? 当我们在 After Update 触发器中执行此操作时会发生什么?

【问题讨论】:

  • 我很确定 SQL Server 会在不检查现有值的情况下更新行,因此即使数据没有更改也会触发触发器等等。

标签: sql sql-server database triggers updates


【解决方案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;

【讨论】:

    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多