7

変更データ キャプチャ (cdc) 用に構成されたテーブルに新しい列が追加されると、ソース テーブルに対して cdc が無効になり、再度有効になるまで、キャプチャ インスタンス テーブルには新しい列がありません。その過程で、既存のキャプチャ インスタンスが削除されます。

既存のデータを一時テーブルにコピーしてから、次の SQL を使用してコピーできると考えました。ただし、cdc.change_tables.start_lsn などの他の CDC メタ情報は無効になります。

同じキャプチャ インスタンス名を使用して、キャプチャ インスタンスの履歴を保存するにはどうすればよいですか?

ありがとう、リッチ

/*Change Data Capture Test - Alter table definition test */

/*Enter restricted mode so we don't lose data changes during this process*/
alter database ChangeDataCaptureTest set AUTO_UPDATE_STATISTICS_ASYNC OFF
alter database ChangeDataCaptureTest set RESTRICTED_USER with ROLLBACK IMMEDIATE
go

/*Add a column to the table*/
alter table dbo.Table1 add value3 varchar(20) DEFAULT '' not null

/*Copy the existing change tracking into a temp table*/
select * into cdc.dbo_Table1_temp from cdc.dbo_Table1_CT

/*Add the new column to the temp table so that we don't have to map
all columns when we copy back, note that we use NULL as the default*/
alter table cdc.dbo_Table1_temp add value3 varchar(20) DEFAULT NULL

/*Disable CDC on the source table, this will drop the associated cdc table*/
exec sys.sp_cdc_disable_table 
@source_schema='dbo',
@source_name='Table1', 
@capture_instance='dbo_Table1'

/*Enable CDC for the table which recreates the CDC table*/
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'Table1',
@role_name     = NULL,
@supports_net_changes = 1,
@filegroup_name = N'ChangeDataCapture'
GO

/*Insert values from the temp table back into the new CDC Table*/
Insert into cdc.dbo_Table1_CT 
SELECT * 
From cdc.dbo_Table1_temp
go

/*Drop the temp table*/
drop table cdc.dbo_Table1_temp

/*Go back into multi-user mode*/
alter database ChangeDataCaptureTest set AUTO_UPDATE_STATISTICS_ASYNC ON
alter database ChangeDataCaptureTest set MULTI_USER
go

/*Add a new row to the table*/
insert into table1
values(12,'zz','g')
4

2 に答える 2

1

リッチ、

このようなデータを保存する最善の方法は、ステージング永続テーブルを作成して、_CT テーブル データを定期的にキャプチャすることです。一般に、cdc データはエンドポイント (ウェアハウス/データ マートなど) によって消費されるまでの保存期間が短いことを知っていると、_CT テーブル データがコピーされるメンテナンス ウィンドウ内にすべての変更が完了していることを確認できます。変更が実装される前のステージング。

ここで考慮すべき 1 つの側面は、(1 つ以上の列を追加または削除することによって) _CT スキーマが変更されたら、そのデータをエンドポイントに引き出すために使用されるプロセスも更新する必要があるということです。

これを克服するために、ステージング テーブル (_CT とエンドポイントの間で使用される) の目的のスキーマを格納するスクリプト ストアを実装し、変更がクライアント DB に実装されると、データをステージングからエンドポイントに移動し、ステージング スキーマを更新します。

うまくいけば、これは思考の糧になります。

于 2016-09-21T16:49:12.940 に答える
-2

lsnレコードも書き出してから、lsntimemappingテーブルに戻す必要があると思います。

于 2010-08-26T17:00:12.750 に答える