插入和删除的伪表存储在哪里?

Nav*_*vin 3 sql sql-server

SQL Server 触发器允许访问 两个特殊表INSERTED- 具有“之后”值和DELETED“之前”值。

这些存储在哪里?它们是否存在于tempdb或与所操作的表位于同一个数据库中?

Mar*_*ith 5

在 SQL Server 2005 之前的版本中,这些表是在需要时从事务日志中读取的

自 SQL Server 2005 起,构成后触发器的插入和删除伪表的行都存储在版本存储中(始终存储在页面中tempdb- 这些页面可能存在于内存中,也可能不存在)。

您可以从下面清楚地看到这一点(在快照隔离和 RCSI 关闭的情况下在数据库中运行)

CREATE TABLE T1 (X BINARY(10));

GO

--B = Before
INSERT INTO T1
VALUES     (0xBBBBBBBBBBBBBBBBBBBB); 

GO

CREATE TRIGGER TR ON T1 AFTER UPDATE
AS
    PRINT 'Trigger called'

GO

DECLARE @mtsn INT 

SELECT @mtsn = ISNULL(MAX(transaction_sequence_num), 0)
FROM   sys.dm_tran_version_store
WHERE  database_id = DB_ID();    

UPDATE T1
SET    X = 0xAAAAAAAAAAAAAAAAAAAA;    --A = After

SELECT transaction_sequence_num,
       version_sequence_num,
       record_image_first_part,
       CASE
         WHEN CHARINDEX(0xBBBBBBBBBBBBBBBBBBBB, record_image_first_part) > 0
           THEN 'Before'
         WHEN CHARINDEX(0xAAAAAAAAAAAAAAAAAAAA, record_image_first_part) > 0
           THEN 'After'
       END
FROM   sys.dm_tran_version_store
WHERE  database_id = DB_ID()
       AND transaction_sequence_num > @mtsn;


DROP TABLE T1 
Run Code Online (Sandbox Code Playgroud)

返回类似的东西

在此输入图像描述