是否可以將所有錶的歷史記錄合併到一個表中?如何在不使用CDC功能的情況下在單個表中維護多個錶的歷史記錄
我嘗試使用由SQL server 2012 enterprise edition
提供的CDC功能,但爲此它創建了每個表的副本,這增加了數據庫中表的數量。
是否有可能跟蹤&將歷史表中發生DML的列名稱&插入?這會造成性能方面的問題嗎?
是否可以將所有錶的歷史記錄合併到一個表中?如何在不使用CDC功能的情況下在單個表中維護多個錶的歷史記錄
我嘗試使用由SQL server 2012 enterprise edition
提供的CDC功能,但爲此它創建了每個表的副本,這增加了數據庫中表的數量。
是否有可能跟蹤&將歷史表中發生DML的列名稱&插入?這會造成性能方面的問題嗎?
這是一個使用觸發器的解決方案。
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]表。
如果你想在時間t記錄該用戶x更新/刪除/插入表y id x,那麼它會引起問題。
選擇您想要審覈的表;爲它們創建審計表並從基表上的觸發器更新它們。很多工作,但最好的辦法。