<分区>
SQL Server 触发器允许访问 two special tables . 已插入
-
使用“之后”值和 DELETED
使用“之前”值。
这些存储在哪里?它们存在于 tempdb
中还是存在于与正在处理的表相同的数据库中?
标签 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
返回类似的东西
关于sql - 插入和删除的伪表存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659798/