2010-04-16 1 views
5

Wenn eine neue Spalte zur Tabelle hinzugefügt wird, die für die Änderungsdatenerfassung (cdc) konfiguriert ist, enthält die Erfassungsinstanztabelle erst dann die neue Spalte, wenn cdc für die Quellentabelle deaktiviert und wieder aktiviert wird. Die bestehende Capture-Instanz wird dabei gelöscht.Sql Server Change Data Capture: Geschützter Verlauf beim Hinzufügen von Spalten?

Ich dachte, ich könnte vorhandene Daten in eine temporäre Tabelle kopieren und dann mit dem folgenden SQL zurück kopieren. Andere CDC-Metainformationen wie dem cdc.change_tables.start_lsn werden jedoch ungültig.

Wie kann der Erfassungsinstanzverlauf beibehalten werden, wenn der Name der Erfassungsinstanz verwendet wird?

Danke, Rich-

/*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') 
+0

Sie können sie wahrscheinlich nicht wieder in derselben Tabelle haben. Kopiere sie in eine neue Tabelle. Beim Abrufen von Berichten "Union" diese Tabelle, um die vorherigen Datensätze zu erhalten. –

Antwort

-2

Ich glaube, Sie auch die LSN Aufzeichnungen schreiben müßten und sich dann in den lsntimemapping Tisch bringen.

0

Reich,

Die beste Methode, solche Daten zu erhalten, ist eine Inszenierung beharrte Tabelle erstellen in regelmäßigen Abständen die _CT Tabellendaten zu erfassen. Wenn Sie wissen, dass cdc-Daten im Allgemeinen kurz vor der Verwendung durch den Endpunkt (Warehouse/Data Mart usw.) haltbar sind, können Sie sicherstellen, dass alle Änderungen innerhalb eines Wartungsfensters abgeschlossen werden, zu dem die _CT-Tabellendaten kopiert werden Staging vor den Änderungen implementiert werden. Der einzige Aspekt, der dabei berücksichtigt werden muss, ist, dass nach dem Ändern des _CT-Schemas (durch Hinzufügen oder Entfernen einer oder mehrerer Spalten) der Prozess, der zum Abrufen dieser Daten in den Endpunkt verwendet wird, ebenfalls aktualisiert werden muss.

Um dies zu überwinden wir ein Skript speichern implementiert, die das beabsichtigte Schema der Staging-Tabelle speichert (verwendet, um zwischen _CT und Endpunkt) und sobald die Änderungen auf dem Client implementiert DB, dann bewegen wir die Daten von in Endpunkt Staging und Update das Staging-Schema.

Hoffentlich wird dies zum Nachdenken anregen.

Verwandte Themen