2016-07-26 4 views
2

Ich habe eine Anforderung, wo ich CDC auf neu hinzugefügten Spalten der Tabelle aktivieren möchte, aber ich kann CDC nicht deaktivieren und erneut aktivieren. Kann ich das irgendwie erreichen?So aktivieren Sie Change Data Capture (CDC) bei neu hinzugefügten Spalten der zugrunde liegenden Tabelle ohne CDC zu deaktivieren

Ich habe eine Lösung gefunden, wo ich alte CDC-Tabellenwerte in eine temporäre Tabelle kopieren kann, dann CDC deaktivieren und dann CDC mit neuem Tabellenschema aktivieren. Später Kopieren der Temp-Tabellenwerte in eine neue CDC-Tabelle und Aktualisieren des LSN-Werts.

Anstelle der oben genannten brauche ich eine Lösung, wo ich die neue Spalte in die CDC-Tabelle aufnehmen kann, während die CDC aktiviert ist.

+1

Mögliches Duplikat von [CDC-Tabelle funktioniert nicht, nachdem neue Spalten zur Quellentabelle hinzugefügt wurden] (http://stackoverflow.com/questions/14958119/cdc-table-not-working-after-adding-new-columns-to -the-source-table) –

+0

@ M.Hassan Ich möchte die CDC auf keinen Fall beim Hinzufügen der neuen Spalte deaktivieren. – Mohan

Antwort

4

CDC unterstützt zwei Instanzen von Erfassungstabellen. So können Sie folgende Schritte ausführen:

  1. hinzufügen Spalte
  2. hinzufügen cdc-Capture inctance
  3. Verschieben von Daten aus alten Tabelle in die neue
  4. deaktivieren alt cdc Instanz

Diese Lösung verhindert, dass Änderungen nicht mehr erfasst werden und Sie keine Daten verlieren.

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

aber wenn ich DDL-Operation auf neu hinzugefügte Spalte "TestColumn" durchgeführt habe, werden Änderungen in der neu erstellten Instanz cdc nicht erfasst.common_EntityTypes2_CT – Mohan

+0

"Daten von alter Tabelle in die neue verschieben". Wäre es genauer zu sagen: "Verschieben Sie Ihren ETL-Prozess, um die neue CDC-Instanz zu verwenden"? Das heißt, Sie können die beiden Instanzen miteinander verknüpfen, indem Sie die min. LSN für die zweite Instanz als Endpunkt für die erste Aufzeichnungsinstanz verwenden. Nachdem Sie alle Datensätze bis einschließlich des Endpunkts von Anfang an verarbeitet haben, wechseln Sie Ihre ETL, um die zweite zu verwenden und die Verarbeitung von dort fortzusetzen. Persönlich verwende ich gerne Abstraktion (d. H. Synonyme oder eine Sicht), um die Tatsache zu verbergen, dass ich CDC-Instanzen umschalte. –

+0

@Mohan müssen Sie neue cdc-Instanz nach dem Hinzufügen neuer Spalte – Backs

1

Die Lösung oben funktioniert gut, wenn Sie eine einzelne Instanz für die Zieltabelle haben, aber wenn man zwei Instanzen haben bereits, könnte man ein wenig weiter aus zu denken brauchen, und einige Planung verwenden.

Die Frage des Datenverlusts ist relevant, aber Sie könnten diese Frage beim Entwerfen des cdc-Prozesses zunächst in Betracht ziehen. Ein sehr relevantes Element ist, was ist der Endpunkt für die Daten? Wenn Sie z. B. eine BI-Lösung, vielleicht ein Warehouse oder eine einfache OLAP-Datenbank wie ein Data-Mart für eine Reporting-Lösung verwenden, sollten Sie Wartungsfenster einführen oder ein aktuelles Wartungsfenster verwenden. Der Prozess ist einfach und der Antwort von Backs nicht unähnlich:

  1. Übertragen Sie alle aktuellen _CT Daten in den Endpunkt.

  2. Deaktivieren Sie die aktuelle Instanz auf dem Tisch (sp_cdc_disable_table)

  3. die Instanz wieder aktivieren mit der aktualisierten Spaltenliste (sp_cdc_enable_table)

Dies ermöglicht die Änderungen auch wenn zwei geführt werden Instanzen zielen bereits auf die gleiche Tabelle ohne Verlust von Client-Daten.

Hinweis: Die Verwendung des Spaltenlistenparameters ist nicht so sehr eine Voraussetzung (wenn Sie alle Spalten erfassen möchten), aber die Konsistenz ist möglicherweise vorzuziehen, wenn andere Entwickler den Code überprüfen müssen. Trotzdem ist es genauso einfach, diese Daten über die cdc.X-Systemtabellen zu erhalten.

Verwandte Themen