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


sys.sp_cdc_enable_table (Transact-SQL)

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

Система отслеживания измененных данных доступна не во всех выпусках Microsoft SQL Server. Список функций, поддерживаемых в разных выпусках SQL Server, см. в разделе Функции, поддерживаемые различными выпусками SQL Server 2014.

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

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

Синтаксис

sys.sp_cdc_enable_table 
  [ @source_schema = ] 'source_schema', 
  [ @source_name = ] 'source_name' ,  [,[ @capture_instance = ] 'capture_instance' ]
  [,[ @supports_net_changes = ] supports_net_changes ]
  , [ @role_name = ] 'role_name'
  [,[ @index_name = ] 'index_name' ]
  [,[ @captured_column_list = ] 'captured_column_list' ]
  [,[ @filegroup_name = ] 'filegroup_name' ]
  [,[ @allow_partition_switch = ] 'allow_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 AdventureWorks2012;
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 AdventureWorks2012;
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

См. также

Справочник

sys.sp_cdc_disable_table (Transact-SQL)

sys.sp_cdc_help_change_data_capture (Transact-SQL)

cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)

cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

sys.sp_cdc_help_jobs (Transact-SQL)