9

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

我今天一直在尝试它,到目前为止一切都很好,我看不到它支持的一件事是跟踪谁实际进行了更改。谁执行了声明?

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

4

6 回答 6

7

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

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

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

于 2010-08-20T17:00:23.187 回答
7

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

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

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

希望这可以帮助。

于 2017-02-22T12:21:58.557 回答
1

Edmundo 先生,在我看来,CDC 还没有准备好迎接黄金时段。目前,在启用 CDC 的情况下从 Visual Studio 部署数据库项目似乎有些困难(它不喜欢 DDL 更改)。此外,CDC 似乎有一个内置的数据生命周期结束清理过程,所以如果你真的想长期维护你的审计历史,这对你来说可能是个糟糕的时期。

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

Change Tracking 仅适用于 DDL 而不是 DML,因此您不走运。

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

于 2010-05-26T17:05:01.450 回答
1

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

于 2009-05-17T02:50:54.627 回答
0

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

于 2009-08-04T15:58:10.227 回答
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
于 2016-02-17T11:58:12.690 回答