我们的数据库是插入密集型(每晚200-500k),但更新灯(每天可能有几百个)。
我需要在无限期的时间内保留插入行本身所有更改的历史记录(但不是实际的插入)。我很乐意使用Change Data Capture,但支持这一点所需的空间量是不可行的。如果我能想出做下面的事情之一,我的生活就会容易得多。
1)限制更改数据仅跟踪UPDATES和DELETES 2)定期清理CDC表中的INSERTS
在过去,我刚刚使用了一个触发器(它仍然不在桌面上!)。
答案 0 :(得分:2)
我只会使用触发器来捕获更新和删除。
我认为你不能告诉CDC DML应该注意什么,我认为让CDC记录所有这些插入只是为了删除它们是非常浪费的。这本身就是昂贵的,并且它将导致的碎片也会导致您针对捕获表运行的任何查询出现问题(您将拥有大量空白页面)以及工作统计数据必须不断进行保持统计数据最新。
您可以在捕获表上放置一个而不是插入触发器,它什么都不做,但是我没有尝试过这样做,甚至看看它是否被允许,我当然不知道会有什么影响有CDC的功能。可能值得一些调查,但即使这个黑客确实有效,我的原始答案仍然有效:只需使用触发器。
答案 1 :(得分: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)