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
, для ограничения доступа к измененным данным не используется роль gating.
Если в настоящее время существует роль, она используется. Если роль не существует, предпринята попытка создать роль базы данных с указанным именем. При создании роли базы данных из ее имени удаляются конечные строковые пробелы справа. Если вызывающий объект не авторизован для создания роли в базе данных, операция хранимой процедуры завершается сбоем.
[ @capture_instance = ] 'capture_instance'
Имя экземпляра системы отслеживания, используемого для внутреннего именования объектов системы отслеживания измененных данных. @capture_instance является sysname и не может бытьNULL
.
Если это имя не задано, то оно является производным от имени схемы источника и имени исходной таблицы в формате <schemaname>_<sourcename>
. @capture_instance не может превышать 100 символов и должен быть уникальным в базе данных. Указывает, является ли указанный или производный, @capture_instance обрезка любого пробела справа от строки.
Исходная таблица не может иметь более двух экземпляров системы отслеживания. Дополнительные сведения см. в sys.sp_cdc_help_change_data_capture.
[ @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