如何在不使用CDC功能的情况下在单个表中维护多个表的历史记录

时间:2014-01-07 13:05:22

标签: sql sql-server dml cdc

是否可以将所有表的历史记录合并到一个表中?

我尝试使用SQL server 2012 enterprise edition提供的CDC功能,但为此它会创建每个表的副本,这会增加数据库中表的数量。

它是否也可能跟踪&插入表名称&在历史表中发生DML的列名?这会导致任何性能问题吗?

2 个答案:

答案 0 :(得分:1)

如果你想在时间t记录用户x更新/删除/插入表y id x,那么它将导致问题。

选择要审核的表格;为它们创建Audit表并从基表上的触发器更新它们。很多工作,但最好的方式。

答案 1 :(得分:1)

以下是使用触发器的一种解决方案。

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

这是文章。

http://craftydba.com/?p=2060

下图显示了一个带有多个[TRG_TRACK_DML_CHGS_XXX]触发器的[LOG_DML_CHANGES]表。

enter image description here