僅在SQLServer2008(含)以后的企業版、開發版和評估版中可用。
詳解:
CDC功能主要捕獲SQLServer指定表的增刪改操作,由于任何操作都會寫日志(哪怕truncate),所以CDC的捕獲來源于日志文件。日志文件會把更改應用到數據文件中,同時也會標記符合要求的數據標記為需要添加跟蹤的項。然后通過一些配套函數,最后寫入到數據倉庫中。大概流程:
第一步、對目標庫顯式啟用CDC:
在當前庫使用sys.sp_cdc_enable_db。返回0(成功)或1(失敗)。注意,無法對系統數據庫和分發數據庫啟用該功能。且執行者需要用sysadmin角色權限。
該存儲過程的作用域是整個目標庫。包含元數據、DDL觸發器、cdc架構和cdc用戶。
使用以下代碼啟用:
復制代碼代碼如下:</p><p>USE AdventureWorks</p><p>GO</p><p>EXECUTE sys.sp_cdc_enable_db;
GO</p><p>
在一開始直接執行時,出現了報錯信息:
消息22830,級別16,狀態1,過程sp_cdc_enable_db_internal,第193 行
無法更新元數據來指示已對數據庫AdventureWorks 啟用了變更數據捕獲。執行命令'SetCDCTracked(Value = 1)' 時失敗。返回的錯誤為15517: '無法作為數據庫主體執行,因為主體"dbo" 不存在、無法模擬這種類型的主體,或您沒有所需的權限。'。請使用此操作和錯誤來確定失敗的原因并重新提交請求。
這里引出了另外一個知識點:錯誤號 15517 的錯誤
這種錯誤會在很多地方出現,如還原數據庫的時候也會有可能出現。共同點是:某個/些存儲過程使用了具有WITHEXECUTE AS 的選項。使其在當前庫具有了某個架構,但是當在別的地方執行時,由于沒有這個架構,所以就報錯,解決方法:
ALTER AUTHORIZATION ON DATABASE::[AdventureWorks] TO [sa]
經過檢查,uspUpdateEmployeeHireInfo這個存儲過程的確有:WITH EXECUTE AS CALLER
使用sa的原因是即使sa被禁用,sa還是存在的。所以不會報錯。
現在重新執行:
復制代碼代碼如下:</p><p>USE AdventureWorks</p><p>GO</p><p>EXECUTE sys.sp_cdc_enable_db;</p><p>GO</p><p>
啟用成功,然后通過以下語句檢查是否成功:
復制代碼代碼如下:</p><p>SELECT is_cdc_enabled,CASEWHENis_cdc_enabled=0THEN'CDC功能禁用'ELSE'CDC功能啟用'END描述</p><p>FROM sys.databases</p><p>WHERE NAME = 'AdventureWorks'
創建成功后,將自動添加CDC用戶和CDC架構。
新聞熱點
疑難解答
圖片精選