2

今天我看到一篇不错的帖子,作者在其中证明,如果您在没有定义任何索引的情况下更新表的列,则会发生“就地更新”,而不是传统的删除\插入。

考虑到这一点,我运行了一个小测试,在该测试中我Update在表上创建了一个触发器并尝试访问INSERTED魔术表,这就是问题所在。

我可以访问INSERTED魔术表,如果就地更新不使用传统的删除\插入,有人可以解释一下吗?为什么可以访问魔术表?

这些是我的 SQL 语句来证明这件事。

主表:

CREATE TABLE TestingUpdate1 (
  ID INT IDENTITY,
  SomeString CHAR(50)
)

INSERT INTO TestingUpdate1 (SomeString)
VALUES
('One'),('Two'),('Three'),('Four'),('Five'),('Six'),('Seven'),('Eight'),('Nine')

CHECKPOINT -- truncate the log, DB is in simple recovery.

UPDATE TestingUpdate1
SET SomeString = 'NotFour'
WHERE ID = 4 -- one row

SELECT Operation, Context, AllocUnitName, [Transaction Name], Description FROM fn_dblog(NULL, NULL) AS TranLog

第二张表:

CREATE TABLE TestingUpdate4 (
  ID INT IDENTITY,
  SomeString CHAR(50)
)

INSERT INTO TestingUpdate4 (SomeString)
VALUES
('One'),('Two'),('Three'),('Four'),('Five'),('Six'),('Seven'),('Eight'),('Nine')

扳机 :

CREATE TRIGGER ViewCustomerTrigger ON TestingUpdate1
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON

UPDATE TestingUpdate4 
SET SomeString = i.SomeString
FROM INSERTED i
END
GO

select * from TestingUpdate4
select * from TestingUpdate1

提前致谢

4

1 回答 1

6

更新触发器中的INSERTED和表始终显示更新行的逻辑前后版本。DELETED

无论是作为就地更新还是作为插入/删除物理实现,都取决于执行计划,并且与这些表的内容无关。

于 2013-05-11T08:37:03.493 回答