知方可補不(bu)足~用(yong)CDC功能來對(dui)數據庫變更進(jin)行捕(bu)捉
如果我們希(xi)望監(jian)(jian)視一個(ge)數據表的(de)(de)變(bian)化,在(zai)sql2008之(zhi)前(qian)的(de)(de)版本(ben)里,在(zai)數據庫端(duan)(duan)可能(neng)想到的(de)(de)只有(you)觸發器,或者(zhe)在(zai)程(cheng)序端(duan)(duan)通過監(jian)(jian)視自己(ji)的(de)(de)insert,update,delete來實(shi)現相應(ying)的(de)(de)功(gong)能(neng),這(zhe)種(zhong)實(shi)現無(wu)疑是讓(rang)我們感到恐懼(ju)的(de)(de),不夠(gou)靈活(huo)的(de)(de),而(er)當進行sql2008后(hou),這(zhe)種(zhong)情(qing)況得到了本(ben)質的(de)(de)改(gai)變(bian),sql2008為我們提供(gong)了CDC功(gong)能(neng),它可以(yi)實(shi)時(shi)對指定的(de)(de)數據表進行監(jian)(jian)控,當前(qian)它同時(shi)對產生SQL的(de)(de)一些負載(zai)。
CDC工作流程
CDC功能(neng)主(zhu)要捕獲SQLServer指(zhi)定表的增刪改(gai)操(cao)作,由于任何(he)操(cao)作都會寫(xie)(xie)日志(哪怕truncate),所以CDC的捕獲來(lai)源于日志文件(jian)(jian)。日志文件(jian)(jian) 會把更(geng)改(gai)應用到數據文件(jian)(jian)中(zhong),同時也會標(biao)記符(fu)合要求的數據標(biao)記為需要添加(jia)跟蹤的項。然后通過一些配套(tao)函數,最后寫(xie)(xie)入到數據倉庫中(zhong)。
CDC實現步驟
第一步、對目標庫顯式啟用CDC:
在當前庫(ku)使用sys.sp_cdc_enable_db。返回0(成功)或1(失(shi)敗(bai))。注意,無法對系統(tong)數據庫(ku)和分發數據庫(ku)啟用該功能。且執行者需(xu)要用sysadmin角色(se)權限。
該存儲過程的作用域是整個目標庫。包含元數(shu)據、DDL觸發器、cdc架構(gou)和cdc用戶。
使用以下代碼啟用:
USE tableName Go EXECUTE sys.sp_cdc_enable_db GO
SELECT IS_CDC_ENABLED , CASE WHEN IS_CDC_ENABLED = 0 THEN 'CDC功(gong)能禁用' ELSE 'CDC功能啟用' END 描述 FROM SYS.DATABASES WHERE NAME = 'tableName'
同時,數據庫的(de)用戶(hu)將會多了一(yi)個CDC用戶(hu)
第二步、對目標表啟用CDC
使(shi)用db_owner角色的(de)成(cheng)員執行sys.sp_cdc_enable_table為每個需要跟(gen)蹤的(de)表創(chuang)建(jian)捕獲實(shi)例(li)。然后通過sys.tables目錄視圖中的(de)is_tracked_by_cdc列(lie)來判斷是否(fou)創(chuang)建(jian)成(cheng)功。
默認情況下(xia)會對表的(de)全部列(lie)做(zuo)捕(bu)獲。如果只(zhi)需(xu)要對某些列(lie)做(zuo)捕(bu)獲,可以使(shi)用@captured_column_list參(can)數指(zhi)定這些列(lie)。
如果要(yao)把更改(gai)表(biao)放到文件組里的話,最(zui)好創建單(dan)獨的文件組(最(zui)起碼與源表(biao)獨立)。
EXEC sys.sp_cdc_enable_table @source_schema = 'DBO', @source_name = 'WebManageUsers', @role_name = NULL
注意,source_schema說的是數據庫架(jia)構者,如dbo,cdc等
@source_name說的就是數據表名,@role_name是角(jiao)色(se)(se)名,為(wei)null表示(shi)對角(jiao)色(se)(se)沒有特別限制
當設置完(wan)成(cheng)數據(ju)表的CDC功能后,我(wo)們看一下是(shi)否已經配置成(cheng)功,用下面代碼
SELECT NAME , IS_TRACKED_BY_CDC , CASE WHEN IS_TRACKED_BY_CDC = 0 THEN 'CDC功能禁(jin)用' ELSE 'CDC功能啟用' END 描述 FROM SYS.TABLES WHERE OBJECT_ID IN ( OBJECT_ID('DBO.WebManageUsers') )
當我們對WebManageUsers表修(xiu)改數據后,可(ke)以在DBO_WebManageUsers_CT表中(zhong)查到(dao)相應的(de)(de)結果,從表名(ming)中(zhong)可(ke)以看到(dao),CDC表的(de)(de)命名(ming)規則是(shi)架(jia)構名(ming)_表名(ming)_CT,呵呵。
SELECT * FROM cdc.DBO_WebManageUsers_CT