大约一周前,我在 SOF 上问了一个关于审计 SQL 数据更改的问题。出现了关于使用触发器的常见内容,在 SQL Server 2008 中也提到了 CDC。
我今天一直在尝试它,到目前为止一切都很好,我看不到它支持的一件事是跟踪谁实际进行了更改。谁执行了声明?
我很想知道是否有人使用 CDC 进行审计,以及您如何跟踪谁进行了更改?
大约一周前,我在 SOF 上问了一个关于审计 SQL 数据更改的问题。出现了关于使用触发器的常见内容,在 SQL Server 2008 中也提到了 CDC。
我今天一直在尝试它,到目前为止一切都很好,我看不到它支持的一件事是跟踪谁实际进行了更改。谁执行了声明?
我很想知道是否有人使用 CDC 进行审计,以及您如何跟踪谁进行了更改?
我直接使用更改了 CDC 表: ALTER TABLE cdc.dbo_MyTable_CT ADD UserName nvarchar(50) NULL DEFAULT(SUSER_SNAME())
顺便说一句,您不需要日期信息,因为它已经在开始和结束 LSN 字段中。
我唯一的问题是我的用户通过允许他们修改权限的 Windows 组登录,但用户名字段始终是我的用户名而不是他们的用户名。我还没有找到解决这个问题的方法。
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 列。
CDC 确实不是为审计而设计的。如果您正在寻找审计功能,您应该使用SQL Server Audit。
虽然并不理想,但普遍的共识似乎是 CDC 不会捕获谁进行了更改,但我们已经实现了 CreatedBy/Date 和 UpdatedBy/Date 列,可用于查看谁触发了更改。当然,为此,更新行的 SP 或 SQL 语句需要分别使用 suser_name() 和 getDate() 显式设置 UpdatedBy/Date 字段。我同意开箱即用会很好,这会让 CDC 做一些本不该做的事情,但我也在尝试使用 CDC 来异步审计数据更改,而不是使用传统的触发器。
这是一个触发器,可以通过一些自动化过程或在该特定表上启用 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