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


10

跟踪谁进行了CDC识别的更改。

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

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

简而言之:我怎么知道谁在变更数据捕获中进行了更改?

Answers:


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的内置功能无法满足您的要求。:-(


@RThomas,即使商品已关闭,您仍然可以对其进行投票-偶尔会再​​次访问它们。比起投票更有用的是添加一条注释,指出将使该信息有用的业务需求的详细信息,其中可能包括重构工作以解决缺少的功能所需的成本。我写了一些有关定性数据如何超过定量数据的文章 ……
亚伦·伯特兰

很高兴知道,我认为封闭意味着也不会投票。我在评论中指出,Oracle在其CDC实现中提供了此功能。这似乎是合乎逻辑的。 docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…–
RThomas

6

您可以添加该列,并在表上有一个触发器,以在插入/更新/删除上填充用户,然后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

0

您能否在主表上添加一个UpdatedBy字段,将其默认设置为SUSER_NAME()或ORIGINAL_LOGIN()并由CDC填充该数据?我相信这将为您提供所需的信息。


这只是让你CDC的SVC帐户/所有者,您可能会注意到,我想这些事情,并记录在2月份我原来的问题的方式回到结果
RThomas

您的评论说您已将其添加到ChangeData表中。我说的是ChangeData表所基于的原始表。但是,我意识到发布此内容仅适用于插入内容
Chef

啊,没听清楚。我明白你的意思了。
RThomas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.