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

标签 sql sql-server

<分区>

SQL Server 触发器允许访问 two special tables . 已插入 - 使用“之后”值和 DELETED 使用“之前”值。

这些存储在哪里?它们存在于 tempdb 中还是存在于与正在处理的表相同的数据库中?

最佳答案

在 SQL Server 2005 之前的版本中,这些表 were read from the transaction log when needed .

自 SQL Server 2005 以来,构成后触发器的插入和删除伪表的行都存储在 the version store 中。 (总是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 = 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 

返回类似的东西

enter image description here

关于sql - 插入和删除的伪表存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659798/

相关文章:

sql - 查找表格中的相似之处

c# - 将 dd/MM/yyyy 输入转换为日期格式的 yyyy-MM-dd,而不是 varchar/datetime

sql - MySQL:删除 Left Join 上的重复列,3 个表

mysql - SQL 中的存储过程用于连接两个表

sql - 如何在 SQL Server 中使用 FOR XML PATH 删除前导空格

sql-server - SSRS Report 将数据分成多个工作表

mysql - SQL:应用程序跨数据库仅维护一种通用模式

sql - LINQ 查询中动态列名的 where 子句?

sql - 如何获取 SQL 格式的输出

sql - 增加 SQL Server 中的 NVARCHAR 列大小会导致索引重建吗?