今天我看到一篇很好的帖子,作者已经证明,如果你在没有定义任何索引的情况下更新表的一列,就会发生“就地更新”,而不是传统的删除\插入。
考虑到这一点,我运行了一个小测试,我在表上创建了一个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
提前致谢
答案 0 :(得分:6)
更新触发器中的INSERTED
和DELETED
表始终显示更新行版本之前和之后的逻辑。
是否物理实施为就地更新或插入/删除是依赖于执行计划而与这些表的内容无关。