更改数据捕获 - 如何知道谁进行了更改?

RTh*_*mas 11 sql-server-2012 change-data-capture

跟踪谁进行了 CDC 确定的更改。

沿着我的 datetime hack的路线,尝试了相同的方法,将 suser_sname 添加为 cdc 更改跟踪表上具有默认值的新字段。但是,这似乎返回了 cdc 进程的所有者,而不是在基表上启动更改的用户。我也试过 original_login 但它返回了 sql 服务帐户登录。同样,可能与 cdc 进程相关,而不是与发起更改的用户相关。

在堆栈溢出上发现了一个类似的问题,但除了从前端或通过触发器跟踪更改之外没有其他答案,这似乎违背了使用 cdc 的目的。我不会重新发布,但由于原版是在 stackoverflow 上,我想我会在这里尝试一下,特别是如果 R2 或 2012 引入了更好的方法。

因此,简而言之:我如何知道谁对变更数据捕获进行了更改?

Aar*_*and 7

我提交了一个关于此的错误,但它被关闭为“设计使然”。

http://connect.microsoft.com/SQLServer/feedback/details/283707/cdc-options-to-capture-more-data-username-date-time-etc

不幸的是,您将不得不使用另一种技术(例如 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)