在适当的情况下INSERTED魔术表更新

时间:2013-05-11 08:35:01

标签: sql sql-server

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

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

我可以访问INSERTED魔术表,有人可以解释我是否就地更新没有使用传统的Delete \ Insert?为什么人们可以访问魔术桌?

这些是我用来证明这件事的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

提前致谢

1 个答案:

答案 0 :(得分:6)

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

是否物理实施为就地更新或插入/删除是依赖于执行计划而与这些表的内容无关。