Sql-Server

啟用 CDC 的表上的錯誤

  • February 11, 2020

我正在嘗試在啟用 CDC 的數據庫上創建一個 SP。SP 包含使用 UPDATETEXT 命令對啟用了 CDC 的表的更新語句,但 CREATE PROCEDURE 語句已生成錯誤消息。

“不允許使用 UPDATETEXT,因為該列正在由並發快照處理,或者正在復製到非 SQL Server 訂閱伺服器,或者在允許數據轉換服務 (DTS) 的發布中發布,或者被更改數據擷取跟踪。”

我已按照文章上的說明對 sp 具有命令 UPDATETEXT 的表禁用 CDC 然後創建 SP 並在創建 sp 後為該表重新啟用 CDC

問題:

  1. 這個錯誤背後的原因是什麼?
  2. UPDATETEXT 命令將來會影響日誌記錄嗎?因為我們正在考慮使用 CDC 來審計變更。

這個錯誤背後的原因是什麼?

它在錯誤消息中,

“不允許使用 UPDATETEXT,因為……或被變更數據擷取跟踪。

您不能在 CDC 跟踪的列上使用它。

測試

創建表並插入範例數據

CREATE TABLE dbo.tablea
(id int identity(1,1) PRIMARY KEY NOT NULL, UpdateTextTest TEXT)

INSERT INTO Dbo.tablea(UpdateTextTest)
VALUES('bBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB')

在沒有 CDC 的情況下測試 updatetext

DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(UpdateTextTest)
FROM dbo.tablea

UPDATETEXT   tablea.UpdateTextTest  @ptrval 8 1 'c';

這執行良好

結果

id  UpdateTextTest
1   bBbBbBbBcBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB

第 9 個值更改為“C”。

在數據庫和表上啟用 CDC

use my_test
EXEC sys.sp_cdc_enable_db;

EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'tablea',  
@role_name     = NULL ,  
@filegroup_name = N'PRIMARY',  
@supports_net_changes = 1;
GO  

嘗試執行相同的查詢

DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(UpdateTextTest)
FROM dbo.tablea

UPDATETEXT   tablea.UpdateTextTest  @ptrval 8 1 'c';

同樣的錯誤

Msg 7137, Level 16, State 1, Line 41
UPDATETEXT is not allowed because the column is being processed by a concurrent snapshot or is being replicated to a non-SQL Server Subscriber or Published in a publication allowing Data Transformation Services (DTS) or tracked by Change Data Capture.

順便說一句,updatetext 可能會在未來的版本中被刪除,並且TEXT,NTEXTIMAGE數據類型也被棄用

此功能處於維護模式,可能會在 Microsoft SQL Server 的未來版本中刪除。避免在新的開發工作中使用此功能,併計劃修改目前使用此功能的應用程序。請改用大值數據類型和 UPDATE 語句的 .WRITE 子句。

來源


你能做什麼?

我建議嘗試將列更改為nvarchar(max)varchar(max)varbinary(max)根據使用的已棄用數據類型,然後使用.write.

用文字測試:

UPDATE tablea
SET UpdateTextTest .WRITE (N'c',9,1)

Msg 258, Level 15, State 1, Line 44
Cannot call methods on text.

就像現在一樣,我不能使用 .Write 因為數據類型是文本。

在啟用 CDC 的情況下更改數據類型並再次測試查詢。 更改表 tablea 更改列 UpdateTextTest varchar(MAX)

UPDATE tablea
SET UpdateTextTest .WRITE (N'c',9,1)  

結果:

id  UpdateTextTest
1   bBbBbBbBccbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbB

第 10 個值也更改為“c”。


額外的資訊

Readtext 與 cdc 一起使用

DECLARE @ptrval varbinary(16);  
SELECT @ptrval = TEXTPTR(UpdateTextTest)   
  FROM tablea pr 

READTEXT tablea.UpdateTextTest @ptrval 1 1;  

結果:

UpdateTextTest
B

Writetext 不適用於 CDC

DECLARE @ptrval binary(16);  
SELECT @ptrval = TEXTPTR(UpdateTextTest)   
FROM tablea pr
WRITETEXT tablea.UpdateTextTest @ptrval 'DDDDDD';  

錯誤:

Msg 7138, Level 16, State 1, Line 92
The WRITETEXT statement is not allowed because the column is being replicated with Data Transformation Services (DTS) or tracked by Change Data Capture.

引用自:https://dba.stackexchange.com/questions/226777