是否可以将所有表的历史合并到一个表中?
我尝试使用 CDC 提供的功能SQL server 2012 enterprise edition
,但为此它会创建每个表的副本,这会增加数据库中表的数量。
是否也可以将发生 DML 的表名和列名跟踪并插入到历史表中?这会导致性能问题吗?
是否可以将所有表的历史合并到一个表中?
我尝试使用 CDC 提供的功能SQL server 2012 enterprise edition
,但为此它会创建每个表的副本,这会增加数据库中表的数量。
是否也可以将发生 DML 的表名和列名跟踪并插入到历史表中?这会导致性能问题吗?
如果您想记录的不仅仅是用户 x 在时间 t 更新/删除/插入的表 y id x,那么它将导致问题。
选择要审核的表;为它们创建审计表并从基表上的触发器更新它们。很多工作,但最好的方法。
这是使用触发器的一种解决方案。
1 - 为您想要历史记录的每个表创建一个触发器。
2 - 在操作期间将修改后的数据(INS、UPD、DEL)从基表复制到审计表。
3 - 以 XML 格式存储所有数据,以便多个表可以将数据存储在同一个审计表中。
我确实在我的一篇博客文章中介绍了这一点。这是审核少量数据的绝佳解决方案。每秒处理数千个记录更改时,可能存在开销问题。
请在部署到生产环境之前进行测试!
这是跟踪表名称以及更改类型的审计表。
/*
Create data level auditing - table.
*/
-- Remove table if it exists
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[ADT].[LOG_DML_CHANGES]') AND type in (N'U'))
DROP TABLE [ADT].[LOG_DML_CHANGES]
GO
CREATE TABLE [ADT].[LOG_DML_CHANGES]
(
[ChangeId]BIGINT IDENTITY(1,1) NOT NULL,
[ChangeDate] [datetime] NOT NULL,
[ChangeType] [varchar](20) NOT NULL,
[ChangeBy] [nvarchar](256) NOT NULL,
[AppName] [nvarchar](128) NOT NULL,
[HostName] [nvarchar](128) NOT NULL,
[SchemaName] [sysname] NOT NULL,
[ObjectName] [sysname] NOT NULL,
[XmlRecSet] [xml] NULL,
CONSTRAINT [pk_Ltc_ChangeId] PRIMARY KEY CLUSTERED ([ChangeId] ASC)
)
GO
这是这篇文章。
下图显示了具有多个 [TRG_TRACK_DML_CHGS_XXX] 触发器的单个 [LOG_DML_CHANGES] 表。