<cdc.fn_cdc_get_net_changes_capture_instance> (Transact-SQL)

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

Возвращает одну строку чистого изменения для каждой исходной строки, измененной в пределах указанного диапазона номеров последовательности журналов (LSN).

Подождите, что такое LSN? Каждая запись в журнале транзакций SQL Server однозначно определяется номером последовательности журналов (LSN). LSN упорядочены таким образом, что если LSN2 больше LSN1, изменение, описанное записью журнала, на которую ссылается LSN2, произошло после изменения, описанного записью журнала LSN.

LSN записи журнала, в которой произошло значительное событие, может быть полезно для создания правильных последовательностей восстановления. Так как LSN упорядочены, их можно сравнить с равенством и неравенством (т <. е. , >=, =, =, <=, >=). Такие сравнения полезны при построении последовательностей восстановления.

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

Эта функция перечисления создается, когда в исходной таблице включается система отслеживания измененных данных с указанием сетевого отслеживания. Чтобы включить сетевое отслеживание, исходная таблица должна иметь первичный ключ или уникальный индекс. Имя функции является производным и использует формат cdc.fn_cdc_get_net_changes_<capture_instance>, где <capture_instance> является значением, указанным для экземпляра записи, когда исходная таблица была включена для записи измененных данных. Дополнительные сведения см. в разделе sys.sp_cdc_enable_table (Transact-SQL).

Соглашения о синтаксисе Transact-SQL

Синтаксис

  
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  
  
<row_filter_option> ::=  
{ all  
 | all with mask  
 | all with merge  
}  

Аргументы

from_lsn

Номер LSN, представляющий нижнюю конечную точку диапазона LSN, включаемую в результирующий набор. from_lsn является двоичным(10).

Только строки в cdc.[ capture_instance]_CT таблицу изменений со значением __$start_lsn больше или равно from_lsn включены в результирующий набор.

to_lsn

Номер LSN, представляющий верхнюю конечную точку диапазона LSN, включаемую в результирующий набор. to_lsn является двоичным(10).

Только строки в cdc.[ capture_instance]_CT таблицу изменений со значением в __$start_lsn меньше или равно from_lsn или равно to_lsn , включены в результирующий набор.

<row_filter_option ::= { все | все с маской> | все с слиянием }

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

all
Возвращает LSN окончательного изменения строки и операцию, необходимую для применения строки в столбцах метаданных __$start_lsn и __$. Столбец __$update_mask всегда имеет значение NULL.

all with mask
Возвращает LSN окончательного изменения строки и операцию, необходимую для применения строки в столбцах метаданных __$start_lsn и __$. Кроме того, при возврате операции обновления (__$operation = 4) сохраненные столбцы, измененные в обновлении, помечаются в значении, возвращаемом в __$update_mask.

all with merge
Возвращает номер LSN окончательного изменения строки в столбцах метаданных __$start_lsn. Операция __$столбца будет одним из двух значений: 1 для удаления и 5, чтобы указать, что операция, необходимая для применения изменения, является вставой или обновлением. Столбец __$update_mask всегда имеет значение NULL.

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

Таблица возвращенной информации

Имя столбца Тип данных Описание:
__$start_lsn binary(10) Номер LSN, связанный с фиксацией транзакции изменения.

Все изменения, зафиксированные в одной транзакции, имеют общий номер LSN фиксации. Например, если операция обновления в исходной таблице изменяет два столбца в двух строках, таблица изменений будет содержать четыре строки, каждая из которых содержит одну и ту же строку __$start_lsnvalue.
__$operation int Определяет операцию языка обработки данных (DML), необходимую для применения строки информации об изменениях к целевому источнику данных.

Если параметр row_filter_option имеет значение all или all with mask, то значение в этом столбце может быть одним из следующих:

1 = удаление

2 = вставка

4 = обновление

Если параметр row_filter_option имеет значение all with merge, то значение в этом столбце может быть одним из следующих:

1 = удаление

5 = вставка или обновление
__$update_mask varbinary(128) Битовая маска, в которой каждому отслеживаемому столбцу, определенному для экземпляра отслеживания, соответствует один бит. В этом значении все определенные биты установлены в значение 1, если__$operation = 1 или 2. Если операция __$= 3 или 4, то только эти биты, соответствующие измененным столбцам, имеют значение 1.
<отслеживаемые столбцы исходной таблицы> Различается Остальные столбцы, возвращенные функцией, — это столбцы из исходной таблицы, определенные как отслеживаемые при создании экземпляра отслеживания. Если в списке отслеживаемых столбцов не указано ни одного столбца, возвращаются все столбцы в исходной таблице.

Разрешения

Необходимо членство в предопределенной роли сервера sysadmin или предопределенной роли базы данных db_owner. Всем остальным пользователям необходимо разрешение SELECT для всех отслеживаемых столбцов в исходной таблице. Кроме того, если для экземпляра отслеживания была определена шлюзовая роль, требуется членство в этой роли базы данных. Если вызывающий объект не имеет разрешения на просмотр исходных данных, функция возвращает строку со значениями NULL для всех столбцов.

Замечания

Изменения уникального идентификатора строки вызывают fn_cdc_get_net_changes отображение начальной команды UPDATE с помощью команды DELETE, а затем команды INSERT. Это поведение необходимо для отслеживания ключа до и после изменения.

Ошибка 313 ожидается, если диапазон LSN не подходит при вызове cdc.fn_cdc_get_all_changes_<capture_instance> или cdc.fn_cdc_get_net_changes_<capture_instance>. lsn_value Если параметр выходит за пределы времени наименьшего LSN или самого высокого LSN, выполнение этих функций возвращается в ошибке 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function Эта ошибка должна быть обработана разработчиком. Пример T-SQL для обходного решения можно найти в ReplTalk на сайте GitHub.

Примеры

В следующем примере функция используется cdc.fn_cdc_get_net_changes_HR_Department для отчета о чистых изменениях, внесенных в исходную таблицу HumanResources.Department в течение определенного интервала времени.

Вначале используется функция GETDATE, чтобы отметить начало интервала времени. После того как к исходной таблице применяются несколько инструкций DML, функция GETDATE вызывается вновь, чтобы отметить конец интервала времени. Затем функция sys.fn_cdc_map_time_to_lsn используется для сопоставления интервала времени с диапазоном запросов отслеживания измененных данных, привязанным значениями LSN. Наконец, к функции cdc.fn_cdc_get_net_changes_HR_Department выполняется запрос, чтобы получить сетевые изменения в исходной таблице за этот интервал времени. Обратите внимание, что вставленная, а затем удаленная строка не появляется в результирующем наборе функции. Это происходит потому, что вставленная, а затем удаленная строка в окне запроса не выполняет сетевых изменений в исходной таблице за этот период времени.

Заметка

Перед выполнением этого примера необходимо сначала запустить пример B в sys.sp_cdc_enable_table (Transact-SQL), чтобы включить CDC в таблице HumanResources.Department. В приведенном ниже примере HR_Department — это имя экземпляра записи CDC, как указано в sys.sp_cdc_enable_tableразделе .

USE AdventureWorks2022;  
GO  
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);  
-- Obtain the beginning of the time interval.  
SET @begin_time = DATEADD(day, -1, GETDATE()) ;  
-- DML statements to produce changes in the HumanResources.Department table.  
INSERT INTO HumanResources.Department (Name, GroupName)  
VALUES (N'MyDept', N'MyNewGroup');  
  
UPDATE HumanResources.Department  
SET GroupName = N'Resource Control'  
WHERE GroupName = N'Inventory Management';  
  
DELETE FROM HumanResources.Department  
WHERE Name = N'MyDept';  
  
-- Obtain the end of the time interval.  
SET @end_time = GETDATE();  
-- Map the time interval to a change data capture query range.  
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);  
SET @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);  
  
-- Return the net changes occurring within the query window.  
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');  

См. также