2016-07-26 7 views
2

新しく追加されたテーブルの列でCDCを有効にする必要があります。私はこれを達成する方法はありますか?CDCを無効にしなくても、元のテーブルの新しく追加された列の変更データキャプチャ(CDC)をアクティブにするには

古いCDCテーブルの値を一時テーブルにコピーし、次にCDCを無効にして新しいテーブルスキーマでCDCを有効にすることができるソリューションが見つかりました。その後、一時テーブル値を新しいCDCテーブルにコピーし、LSN値を更新する。

上記の代わりに、CDCが有効な間に新しい列をCDCテーブルに含めることができる解決策が必要です。

+1

ソーステーブルに新しい列を追加した後に[CDCテーブルが動作しない可能性があります](http://stackoverflow.com/questions/14958119/cdc-table-not-working-after-adding-new-columns-to -the-source-table) –

+0

@ M.Hassan私は、新しい列を追加している間にCDCを無効にしたくありません。 – Mohan

答えて

4

CDCは、キャプチャテーブルの2つのインスタンスをサポートしています。だから、あなたは、次の手順を行うことができます。

  1. は新しいもの
  2. 無効に古いCDCインスタンス
に、古いテーブルから
  • 移動データinctance新しいCDC-キャプチャを追加新しい列を追加します。

    このソリューションは、変更の収集を停止することを防ぎ、データを失うことはありません。あなたがターゲット表上の単一のインスタンスを持っている時には、上記

    EXEC sp_cdc_enable_table 
        @source_schema = N'common', 
        @source_name = N'EntityTypes', 
        @role_name = NULL, 
        @filegroup_name = N'CDC', 
        @capture_instance = 'common_EntityTypes' 
    
    
    ALTER TABLE common.EntityTypes 
        ADD TestColumn int 
    
    EXEC sp_cdc_enable_table 
        @source_schema = N'common', 
        @source_name = N'EntityTypes', 
        @role_name = NULL, 
        @filegroup_name = N'CDC', 
        @capture_instance = 'common_EntityTypes2' 
    
    INSERT INTO cdc.common_EntityTypes2_CT 
    (__$start_lsn, __$end_lsn,__$seqval,__$operation,__$update_mask,Id,Name) 
    SELECT 
        __$start_lsn, 
        __$end_lsn, 
        __$seqval, 
        __$operation, 
        __$update_mask, 
        Id, 
        Name 
    FROM cdc.common_EntityTypes_CT 
    
    EXEC sp_cdc_disable_table 
        @source_schema = N'common', 
        @source_name = N'EntityTypes', 
        @capture_instance = 'common_EntityTypes' 
    
  • +0

    しかし、新しく追加された列 "TestColumn"でDDL操作を実行した場合、変更は新しく作成されたインスタンスcdcには取り込まれません。common_EntityTypes2_CT – Mohan

    +0

    "古いテーブルから新しいテーブルにデータを移動する"。 「新しいCDCインスタンスを使用するようにETLプロセスを移行する」と言ったほうが正確でしょうか?つまり、2番目のインスタンスの最小LSNを最初の取得インスタンスのエンドポイントとして使用して、2つのインスタンスを噛み合わせることができます。最初からそのエンドポイントまでのすべてのレコードを処理したら、ETLを使用して2番目のレコードを使用し、そこから処理を続行します。個人的には、抽象概念(つまりシノニムまたはビュー)を使用して、CDCインスタンスを切り替えるという事実を隠そうとしています。 –

    +0

    @Mohan新しい列を追加した後に新しいcdcインスタンスを作成する必要があります – Backs

    1

    ソリューションはうまく動作しますが、あなたはすでに2つのインスタンスを持っている場合、あなたは出てさらに少し考える必要があり、いくつかの計画を使用する場合があります。

    データの損失に関する問題は当てはまりますが、最初にcdcプロセスを設計するときにこの問題を考慮する必要があります.1つの非常に適切な項目は、データの終点とは何ですか?たとえば、倉庫やレポートソリューションのデータマートのような単純なOLAP DBを使用するBIソリューションを使用している場合は、メンテナンスウィンドウの導入や現在のメンテナンスウィンドウの使用を検討することができます。このプロセスは単純で、Backsの回答と違っていません。

    1. 現在の_CTデータをすべてエンドポイントに転送します。

    2. (sp_cdc_disable_table)テーブルに現在のインスタンスを無効に

    3. 変化があっても2あれば達成するためにこれが可能に更新された列のリスト(sp_cdc_enable_table)で再度

    のインスタンスを有効にしますインスタンスは既にクライアントデータを失うことなく同じテーブルを対象としています。

    注:列リストパラメータを使用する必要はありません(すべての列を取得する場合)が必要ですが、他の開発者がコードを確認する必要がある場合は、一貫性が望ましい場合があります。それでも、cdc.Xシステムテーブルを介してそのデータを取得するのと同じくらい簡単です。

    関連する問題