进行更改的SQL Server 2008 Change Data Capture?

时间:2009-05-15 15:18:56

标签: sql sql-server-2008 auditing cdc

我在大约一周前就SOF提出了一个关于审核SQL数据更改的问题。关于使用触发器的常见问题出现了,在SQL Server 2008中也提到了CDC。

我今天一直在尝试,到目前为止这么好,我看不到它支持的一件事是跟踪谁实际做出了改变。谁执行了声明?

我很想知道是否有人使用CDC进行审核以及如何跟踪谁进行了更改?

7 个答案:

答案 0 :(得分:7)

我直接使用以下方法更改了CDC表: ALTER TABLE cdc.dbo_MyTable_CT ADD UserName nvarchar(50)NULL DEFAULT(SUSER_SNAME())

顺便说一下,你不需要日期信息,因为它已经在开始和结束的LSN字段中。

我唯一的问题是我的用户通过Windows组登录,允许他们修改权限,但UserName字段始终是我的用户名而不是他们的用户名。我还没有找到解决这个问题的方法。

答案 1 :(得分:7)

更改数据捕获不会跟踪用户,进行更改的计算机或更改时间。

跟踪使用CDC进行更改的用户的最佳解决方案是创建一个新字段来存储用户详细信息,这些信息将在每次更改时更新(找到想法here)。

同一系列的另一篇文章引导我使用第三方工具,提供开箱即用的解决方案。我还在评估过程,但到目前为止看起来还不错。您可以在this sequel末尾的便捷表格中查看跟踪信息的比较。

希望这有帮助。

答案 2 :(得分:2)

如果您没有遇到Joe Barreto关于CDC的文章,这可能有所帮助。

http://blogs.technet.com/josebda/archive/2009/03/24/sql-server-2008-change-tracking-ct-and-change-data-capture-cdc.aspx

答案 3 :(得分:1)

CDC确实不是为审计而设计的。如果您正在寻找审核功能,则应使用SQL Server Audit

答案 4 :(得分:1)

MrEdmundo,我认为CDC尚未准备好迎接黄金时段。目前在启用CDC的Visual Studio中部署数据库项目时似乎存在相当大的困难(它不喜欢DDL更改)。此外,CDC似乎有一个内置的数据生命周期清理过程,所以如果您真的想长期维护审计历史记录,这对您来说可能是个不好的时期。

另外,如果我误解了,请纠正我,但似乎SQL审计适用于审核SQL Server中发生的大量事件,例如登录失败,DDL更改等。

更改跟踪仅适用于DDL,而不适用于DML,因此您运气不佳。

如果您的目的是捕获从表中更新或删除的“旧”记录,似乎最好的答案仍然是在dbo.TableName上创建Audit.TableName和update + delete触发器。还要确保TableName包含CreatedBy DEFAULT SUSER,CreatedDate DEFAULT getdate(),ModifiedBy,ModifiedDate的列。

答案 5 :(得分:0)

虽然不理想,但普遍的共识似乎是CDC不会捕获谁进行了更改,但我们已经实现了CreatedBy / Date和UpdatedBy / Date列,可以用来查看是谁触发了更改。当然,为了使其工作,更新行的SP或SQL语句需要分别使用suser_name()和getDate()来适当地显式设置UpdatedBy / Date字段。我同意开箱即用很好,这使得CDC做的事情并非意味着,但我也试图使用CDC来审计数据更改异步,而不是使用传统的触发器。

答案 6 :(得分:0)

这是触发器,可以通过某个自动化过程创建,也可以在该特定表上启用CDC时手动创建,此触发器将解决& 从哪里进行了更改:

CREATE TRIGGER TR_TABLENAME_CDC 
ON TABLENAME
FOR INSERT, UPDATE, DELETE 
AS
DECLARE           
       @SessionID int,
       @AppName nvarchar(255),
       @HostName nvarchar(255),
       @UserName nvarchar(32)
BEGIN
    SELECT @SessionID=@@SPID
    SELECT @AppName=program_name, @HostName=host_name from sys.dm_exec_sessions where session_id = @SessionID

    IF(@AppName = 'BLAH BLAH' OR @AppName = 'XYZ' OR @AppName = 'ABC')
    BEGIN
        SELECT @UserName=login_name from sys.dm_exec_sessions where session_id = @SessionID
        INSERT INTO UserDetail (SessionID, AppName, HostName, UserName) VALUES (@SessionID, @AppName, @HostName, @UserName)
    END 
END