RTh*_*mas 11 sql-server-2012 change-data-capture
跟踪谁进行了 CDC 确定的更改。
沿着我的 datetime hack的路线,我尝试了相同的方法,将 suser_sname 添加为 cdc 更改跟踪表上具有默认值的新字段。但是,这似乎返回了 cdc 进程的所有者,而不是在基表上启动更改的用户。我也试过 original_login 但它返回了 sql 服务帐户登录。同样,可能与 cdc 进程相关,而不是与发起更改的用户相关。
我在堆栈溢出上发现了一个类似的问题,但除了从前端或通过触发器跟踪更改之外没有其他答案,这似乎违背了使用 cdc 的目的。我不会重新发布,但由于原版是在 stackoverflow 上,我想我会在这里尝试一下,特别是如果 R2 或 2012 引入了更好的方法。
因此,简而言之:我如何知道谁对变更数据捕获进行了更改?
我提交了一个关于此的错误,但它被关闭为“设计使然”。
不幸的是,您将不得不使用另一种技术(例如 SQL 审计或触发器)来获取此信息(以及一些自定义代码,以尽可能将其与 CDC 数据相关联)。我也在《SQL Server MVP Deep Dives》(第 1 卷)一书中的“SQL Server 审计、变更跟踪和变更数据捕获”一章中谈到了这个缺陷。
很抱歉,我没有更好的解决方法供您使用,但 CDC 的内置功能无法满足您的要求。:-(
小智 7
您可以添加该列并在表上设置一个触发器以在插入/更新/删除时填充用户,然后 cdc 将存储它。您可以通过使用上下文信息或从实际会话传递用户名来从 UI 中获取用户名
SET @CapturedBy = CAST(REPLACE(CAST(CONTEXT_INFO() AS VARCHAR(10)),CHAR(0),'''''''') AS INT)
IF(@CapturedBy) IS NULL
BEGIN
SELECT @CapturedBy = P.[Code]
FROM sys.dm_exec_sessions AS S
INNER JOIN [dbo].[Person] AS P
ON S.[login_name] = P.[User_Name]
WHERE S.[session_id] = @@spid
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9646 次 |
| 最近记录: |