Поделиться через


sys.sp_cdc_enable_table (Transact-SQL)

Активирует систему отслеживания измененных данных в указанной исходной таблице текущей базы данных. Когда таблица доступна для системы отслеживания измененных данных, запись каждой операции языка обработки данных DML, применяемая к каждой из таблиц, записывается в журнал транзакций. Процесс системы отслеживания измененных данных получает эти сведения из журнала и записывает их в таблицу изменений, к которой осуществляется доступ с помощью набора функций.

Отслеживание информации об изменениях доступно только в следующих выпусках SQL Server 2008: Enterprise Edition, Developer Edition и Evaluation Edition.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

sys.sp_cdc_enable_table 
    [ @source_schema = ] 'source_schema', 
    [ @source_name = ] 'source_name' ,
    [ @role_name = ] 'role_name'
    [,[ @capture_instance = ] 'capture_instance' ]
    [,[ @supports_net_changes = ] supports_net_changes ]
    [,[ @index_name = ] 'index_name' ]
    [,[ @captured_column_list = ] 'captured_column_list' ]
    [,[ @filegroup_name = ] 'filegroup_name' ]
  [,[ @partition_switch = ] 'partition_switch' ]

Аргументы

  • [ @source_schema = ] 'source_schema'
    Имя схемы, к которой принадлежит исходная таблица. Аргумент source_schema имеет тип sysname, не имеет значения по умолчанию и не может принимать значение NULL.

  • [ @source_name = ] 'source_name'
    Имя исходной таблицы, для которой включается система отслеживания информации об изменениях. Аргумент source_name имеет тип sysname, не имеет значения по умолчанию и не может иметь значение NULL.

    Имя source_name должно существовать в текущей базе данных. Система отслеживания измененных данных не может быть активирована для таблиц, включенных в схему cdc.

  • [ @role_name = ] 'role_name'
    Имя роли базы данных, используемой для предоставления доступа к информации об изменениях. Аргумент role_name имеет тип sysname и должен быть указан. Если явно задано значение NULL, то шлюзовая роль не используется для ограничения доступа к информации об изменениях.

    Если роль с указанным именем уже существует, то будет использована она. Если роль с указанным именем не существует, то система пытается ее создать. При создании роли базы данных из ее имени удаляются конечные строковые пробелы справа. Если участник не обладает разрешением на создание роли внутри базы данных, выполнение хранимой процедуры оканчивается ошибкой.

  • [ @capture_instance = ] 'capture_instance'
    Имя экземпляра системы отслеживания, используемого для внутреннего именования объектов системы отслеживания информации об изменениях. Аргумент capture_instance имеет тип sysname и не может быть равен NULL.

    Если имя не указано, то оно образуется путем составления имен исходных схемы и таблицы по формуле schemaname_sourcename. Длина имени capture_instance не должна превышать 100 символов, а само имя должно быть уникальным в рамках базы данных. После указания имени capture_instance все конечные строковые пробелы в нем обрезаются.

    Исходная таблица не может иметь более двух экземпляров системы отслеживания. Дополнительные сведения см. в разделе sys.sp_cdc_help_change_data_capture (Transact-SQL).

  • [ @supports_net_changes = ] supports_net_changes
    Указывает, следует ли активировать поддержку запросов суммарных изменений для данного экземпляра системы отслеживания. Аргумент supports_net_changes имеет тип bit и значение по умолчанию 1, если таблица имеет первичный ключ или уникальный индекс, который определяется параметром @index_name. В противном случае данный параметр по умолчанию принимает значение 0.

    Если значение равно 0, то формируются только функции, запрашивающие все изменения.

    Если значение равно 1, то создаются функции для запроса суммарных изменений.

    Если аргумент supports_net_changes имеет значение 1, то необходимо задать величину index_name либо определить первичный ключ исходной таблицы.

  • [ @index_name = ] **'**index_name'
    Имя уникального индекса, используемого для уникальной идентификации строк в исходной таблице. Аргумент index_name имеет тип sysname и может иметь значение NULL. Если значение задано, то аргумент index_name должен быть допустимым уникальным индексом в исходной таблице. Если аргумент index_name задан, то указанные столбцы индекса имеют приоритет перед любыми столбцами первичного ключа как уникальный идентификатор строки таблицы.

  • [ @captured_column_list = ] 'captured_column_list'
    Задает столбцы исходной таблицы, которые необходимо включить в таблицу изменений. Аргумент captured_column_list имеет тип nvarchar(max) и может принимать значение NULL. Если аргумент имеет значение NULL, то в таблицу изменений включаются все столбцы.

    Имена столбцов должны ссылаться на допустимые столбцы исходной таблицы. Необходимо включить все столбцы, заданные в индексе первичного ключа или в индексе, указанном в параметре index_name.

    Таблица captured_column_list представляет собой список имен столбцов с разделителями-запятыми. Отдельные имена столбцов могут быть заключены в двойные кавычки ("") или квадратные скобки ([]). Если имя столбца содержит внедренную запятую, то его необходимо заключать в кавычки.

    Таблица captured_column_list не должна содержать следующих зарезервированных имен столбцов: __$start_lsn, __$end_lsn, __$seqval, __$operation и __$update_mask.

  • [ @filegroup_name = ] 'filegroup_name'
    Файловая группа, используемая для хранения таблицы изменений, созданной для экземпляра системы отслеживания. Аргумент filegroup_name имеет тип sysname и может иметь значение NULL. Если значение указано, то аргумент filegroup_name должен быть определен для текущей таблицы. Если значение равно NULL, то используется файловая группа, заданная по умолчанию.

    Для хранения системы отслеживания информации об изменениях рекомендуется создать отдельную файловую группу. Дополнительные сведения см. в разделе Настройка системы отслеживания измененных данных.

  • [ @allow_partition_switch= ] 'allow_partition_switch'
    Указывает, возможно ли выполнение команды SWITCH PARTITION инструкции ALTER TABLE для таблицы, в которой включена система отслеживания измененных данных. Аргумент allow_partition_switch имеет тип bit и значение по умолчанию 1.

    Для несекционированных таблиц параметр переключателя всегда равен 1, а указанный параметр не учитывается. Если переключателю явно присваивается значение 0 для несекционированной таблицы, то выдается предупреждение 22857, показывающее, что параметр переключателя пропущен. Если переключателю явно присваивается значение 0 для секционированной таблицы, то выдается предупреждение 22356, показывающее, что операции переключения секций исходной таблицы будут запрещены. Помимо этого, если параметру переключателя явно или по умолчанию присвоено значение 1 и активизированная таблица секционирована, то выдается предупреждение 22855, показывающее, что переключатели секций не будут заблокированы. При любом переключении секций система отслеживания информации об изменениях не будет отслеживать изменения, являющиеся результатом переключения. При обработке изменений это приведет к несогласованности информации об изменениях.

    Важное примечаниеВажно!

    Команда SWITCH PARTITION — это операция метаданных, однако ее выполнение влечет изменение данных. Изменения данных, связанные с этой операцией, не отслеживаются в таблицах изменений системы отслеживания информации об изменениях. Предположим, существует таблица, состоящая из трех секций, и в эту таблицу внесены изменения. Процесс отслеживания отследит операции вставки, обновления и удаления, которые пользователь выполнил в таблице. Однако, если секция переключается в другую таблицу (например, чтобы выполнить массовое удаление), строки, перемещенные в рамках этой операции, не отслеживаются как удаленные строки в таблице изменений. Аналогично, если новая секция с предварительно заполненными строками добавляется в таблицу, эти строки не отражаются в таблице изменений. Это может привести к несогласованности данных, когда изменения передаются приложению и применяются к целевому объекту.

Значения кода возврата

0 (успешное завершение) или 1 (неуспешное завершение)

Результирующие наборы

Нет

Замечания

Прежде чем включить для таблицы системы отслеживания измененных данных, необходимо активизировать саму таблицу. Чтобы определить, активизирована ли база данных для системы отслеживания измененных данных, необходимо выполнить запрос к столбцу is_cdc_enabled в представлении каталога sys.databases. Для активации базы данных используется хранимая процедура sys.sp_cdc_enable_db.

Когда система отслеживания информации об изменениях включена для таблицы, создается таблица изменений и одна или две функции запроса. Таблица изменений выступает в качестве репозитория для изменений исходной таблицы, извлеченных из журнала транзакций процессом отслеживания. Функции запроса используются для извлечения данных из таблицы изменений. Имена этих функций получаются из параметра capture_instance следующими способами.

  • Все функции изменения: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Функции суммарных изменений: cdc.fn_cdc_get_net_changes_<capture_instance>

Если исходная таблица является первой таблицей в базе данных, для которой включена система отслеживания измененных данных, и эта база данных не содержит публикаций транзакций, то хранимая процедура sys.sp_cdc_enable_table также создает задания отслеживания и очистки в указанной базе данных. Указанная функция задает значение 1 для столбца is_tracked_by_cdc представления каталога sys.tables.

ПримечаниеПримечание

При включении системы отслеживания информации об изменениях для таблицы агент SQL Server не должен быть запущен. Однако процесс отслеживания не является процессом журнала транзакций и сохраняет записи в таблицу изменений, если агент SQL Server не запущен.

Разрешения

Требуется членство в предопределенной роли базы данных db_owner.

Примеры

А. Включение системы отслеживания информации об изменениях путем задания только требуемых параметров

В следующем примере включается система отслеживания измененных данных для таблицы HumanResources.Employee. Необходимо задавать только значения требуемых параметров.

USE AdventureWorks2008R2;
GO
EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'HumanResources'
  , @source_name = N'Employee'
  , @role_name = N'cdc_Admin';
GO

Б. Включение системы отслеживания информации об изменениях путем задания дополнительных необязательных параметров

В следующем примере включается система отслеживания измененных данных для таблицы HumanResources.Department. Должны быть указаны все параметры, кроме @allow_partition_switch.

USE AdventureWorks2008R2;
GO
EXEC sys.sp_cdc_enable_table
    @source_schema = N'HumanResources'
  , @source_name = N'Department'
  , @role_name = N'cdc_admin'
  , @capture_instance = N'HR_Department' 
  , @supports_net_changes = 1
  , @index_name = N'AK_Department_Name' 
  , @captured_column_list = N'DepartmentID, Name, GroupName' 
  , @filegroup_name = N'PRIMARY';
GO