Sql Server Change Data Capture: сохранение истории при добавлении столбцов? - PullRequest
6 голосов
/ 16 апреля 2010

Когда новый столбец добавляется в таблицу, настроенную для захвата данных изменений (cdc), таблица экземпляров захвата не будет иметь новый столбец, пока cdc не будет отключен и повторно включен для исходной таблицы. В процессе существующий экземпляр захвата удаляется.

Я думал, что смогу скопировать существующие данные во временную таблицу, а затем скопировать обратно, используя следующий SQL. Однако другая мета-информация CDC, такая как cdc.change_tables.start_lsn, становится недействительной.

Как сохранить историю экземпляров захвата, используя одно и то же имя экземпляра захвата, если оно вообще есть?

Спасибо, Рич

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

Ответы [ 2 ]

1 голос
/ 21 сентября 2016

Рич,

Лучший способ сохранить такие данные - создать промежуточную постоянную таблицу для периодического сбора данных таблицы _CT. Зная, что данные cdc обычно имеют короткий срок годности до того, как они будут использованы конечной точкой (хранилище / витрина данных и т. Д.), Вы можете быть уверены, что любые изменения будут выполнены в пределах окна обслуживания, когда данные таблицы _CT копируются в постановка до внесения изменений.

Один аспект, который следует учитывать при этом, заключается в том, что после изменения схемы _CT (путем добавления или удаления одного или нескольких столбцов) процесс, используемый для извлечения этих данных в конечную точку, также должен быть обновлен.

Чтобы преодолеть это, мы реализовали хранилище сценариев, в котором хранится предполагаемая схема промежуточной таблицы (используемой между _CT и конечной точкой), и после внесения изменений в клиентскую БД мы перемещаем данные из промежуточной в конечную точку и обновляем схема постановки.

Надеюсь, это даст пищу для размышлений.

0 голосов
/ 26 августа 2010

Я думаю, вам нужно будет также записать записи lsn и затем вернуть их обратно в таблицу lsntimemapping.

...