2012-09-11 48 views
2

我們的數據庫是插入inensive(200-500k每晚),但更新光(每天也許幾百個)。變更數據捕獲更新和刪除只有

我需要保留的所有更改的歷史,以插入的行本身無限期的時間(但不是實際的插入)。我很樂意使用「更改數據捕獲」,但支持此功能所需的空間數量不可用。如果我能弄清楚做下面的事情之一,我的生活會容易得多。

1)LIMITE變化數據跟蹤來更新和刪除僅 2)清理只從CDC表INSERTS定期

在過去,我剛使用的觸發(這仍然是不脫表!)。

回答

2

我只想用一個觸發抓拍更新和刪除。

我不認爲你可以告訴CDC DML什麼要注意的,我認爲這是相當浪費,讓CDC記錄所有這些刀片只有事後刪除它們。這本身就是昂貴的,它會造成的碎片也會導致針對捕獲表運行的任何查詢(您將擁有大量空白的頁面)以及工作統計數據不斷需要做的事情保持統計信息最新。

你可以把可能的,而不是在捕獲表,這只是沒有任何INSERT觸發器,但我沒有試過這樣做,甚至看它是否被允許,我當然不知道什麼樣的影響是將具有CDC功能。可能值得一些調查,但我的原始答案仍然存在,即使這種破解工作:只需使用觸發器。

+0

謝謝Aaron ......那是我腦海裏隨處可見的地方。我真的希望將來可以對CDC進行更細緻的控制。 – PseudoToad

+0

我不確定在實施_CT表格時需要考慮碎片問題。根據更改量,您可以制定最佳解決方案。觸發器的價值僅僅是交易的延伸並且是同步的,而不是異步的,它們帶來了自己的風險。 CDC提供了很多方面,因此您不能簡單地確定要捕獲哪些操作,您應該儘可能在最早的時機清理_CT表並將數據卸載到分級或審計數據庫中。 – LogicalMan

+0

很明顯,在清理表格之前,您應該永遠不需要通過_CT表格中的操作刪除行,因爲您可以確定要提取哪些操作並忽略那些不需要的操作,而不管操作如何,應該在最前沿的策略任何解決方案。我們在每週的維護期內完成了對CDC實例的更新,因此在我們對客戶端系統進行所有審計或報告時使用CDC沒有減速或其他問題。 – LogicalMan

0

如果空間是一個考慮因素,你可以隨時分配CDC表用不同的文件組可能住在不同的服務器上運行。你會做這樣的:

ALTER DATABASE YourDatabase 
ADD FILEGROUP [cdc_ChangeTables]; 
go 

--this step requires going on to somewhere on your hard drive and creating a folder 
ALTER DATABASE YourDatabase 
ADD FILE (NAME = N'cdc_ChangeTables', 
      FILENAME = N'E:\NameOfFolderYouSetUp\YourDatabase_cdc_ChangeTables.mdf', 
      SIZE = 1048576KB, 
      FILEGROWTH = 102400KB) 
TO FILEGROUP [cdc_ChangeTables]; 
GO 

然後,當你想設置你的CDC表,你指出來實現這一文件組,而不是:

EXEC sys.sp_cdc_enable_table 
    @source_schema = N'dbo', 
    @source_name = N'TableYouWantToCapture', 
    @role_name = N'cdc_admin', 
    @filegroup_name = N'cdc_ChangeTables', --this is where you name the filegroup from previous step 
    @supports_net_changes = 1, 
    @capture_instance = N'dbo_TableYouWantToCapture', 
    @captured_column_list = 'ColumnName1, ColumnName2'; --comma-delimited list of column names 
GO 

如果您想查詢只更新/刪除,你可以使用系統功能,如下所示:

SELECT * 
FROM cdc.fn_cdc_get_all_changes_dbo_TableYouWantToCapture(@from_lsn, @to_lsn, N'all update old') 
WHERE __$operation IN (1,3,4)