sys.sp_cdc_enable_table (Transact-SQL)

Применимо к:SQL Server

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

Запись измененных данных недоступна в каждом выпуске SQL Server. Список функций, поддерживаемых выпусками SQL Server, см. в выпусках и поддерживаемых функциях SQL Server 2022.

Соглашения о синтаксисе 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 = ] N'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 бит по умолчанию1, если в таблице есть первичный ключ или таблица имеет уникальный индекс, который был идентифицирован с помощью параметра @index_name. В противном случае параметр по умолчанию используется 0.

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

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

Если задано 1значение @supports_net_changes, в таблице изменений создается дополнительный некластеризованный индекс, а функция запроса чистых изменений создается. Так как этот индекс необходимо поддерживать, включение чистых изменений может негативно повлиять на производительность CDC.

[ @index_name = ] 'index_name'

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

[ @captured_column_list = ] N'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 бит с значением по умолчанию1.

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

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

Если вы включите переключение секций на SQL Server, в ближайшее время могут потребоваться операции разделения и слияния. Перед выполнением операции разделения или слияния в таблице с поддержкой реплика или CDC убедитесь, что у секции нет ожидающих реплика команд. Также следует учитывать, что при разбиении или слиянии в секции не должны выполняться операции DML. Если существуют транзакции, которые не обрабатываются в задании чтения журналов или задания записи CDC, или если операции DML выполняются в секции таблицы с поддержкой реплика или CDC в то время как выполняется операция разбиения или слияния (с участием той же секции), это может привести к ошибке обработки (ошибка 608 — нет записи каталога для идентификатора секции) с агентом чтения журналов или заданием записи CDC. Чтобы исправить эту ошибку, может потребоваться повторная инициализация подписки или отключение отслеживания изменения данных для таблицы или базы данных.

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

0 (успешно) или 1 (сбой).

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

Нет.

Замечания

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

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

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

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

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

Разрешения

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

Примеры

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

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

USE AdventureWorks2022;
GO

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

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

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

USE AdventureWorks2022;
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