SQL Server 触发器允许访问 两个特殊表。INSERTED- 具有“之后”值和DELETED“之前”值。
这些存储在哪里?它们是否存在于tempdb或与所操作的表位于同一个数据库中?
在 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)
返回类似的东西
| 归档时间: |
|
| 查看次数: |
767 次 |
| 最近记录: |