今天我看到一篇不错的帖子,作者在其中证明,如果您在没有定义任何索引的情况下更新表的列,则会发生“就地更新”,而不是传统的删除\插入。
考虑到这一点,我运行了一个小测试,在该测试中我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
提前致谢