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


cdc.fn_cdc_get_net_changes_<экземпляр_отслеживания> (Transact-SQL)

Возвращает одну строку сетевого изменения для каждой исходной строки, изменившейся в пределах заданного диапазона номеров 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 имеет тип binary(10).

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

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

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

  • <row_filter_option> ::= { all | all with mask | all with merge }
    Параметр, управляющий содержимым столбцов метаданных, а также строк, возвращаемых в результирующем наборе. Может быть одним из следующих:

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

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

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

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

Возвращенная таблица

Имя столбца

Тип данных

Описание

__$start_lsn

binary(10)

Номер LSN, связанный с фиксацией транзакции изменения.

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

__$seqval

binary(10)

Значение последовательности, используемое для упорядочивания изменений строк в пределах транзакции.

__$operation

int

Определяет операцию языка обработки данных (DML), необходимую для применения строки информации по изменениям к целевому источнику данных.

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

1 = удаление

2 = вставка

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

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

1 = удаление

5 = вставка или обновление.

Значение 5 указывает, что неизвестно, существует ли строка и ее только необходимо обновить или строка не существует и ее необходимо вставить.

__$update_mask

varbinary(128)

Битовая маска, в которой каждому отслеживаемому столбцу, определенному для экземпляра отслеживания, соответствует один бит. В этом значении все определенные биты установлены в значение 1, если__$operation = 1 или 2. Если __$operation = 3 или 4, то в значение 1 устанавливаются только биты, соответствующие измененным столбцам.

<столбцы отслеживаемой исходной таблицы>

непостоянно

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

Разрешения

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

Замечания

Если указанный диапазон номеров LSN выходит за пределы временной шкалы для отслеживания изменений в экземпляре отслеживания, функция возвращает ошибку 208 (недопустимое имя объекта).

Примеры

В следующем примере функция 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 выполняется запрос, чтобы получить сетевые изменения в исходной таблице за этот период. Обратите внимание, что вставленная, а затем удаленная строка не появляется в результирующем наборе функции. Это происходит потому, что вставленная, а затем удаленная строка в окне запроса не выполняет сетевых изменений в исходной таблице за этот период времени. Перед запуском этого примера необходимо выполнить пример Б из раздела sys.sp_cdc_enable_table (Transact-SQL).

USE AdventureWorks2008R2;
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 = GETDATE() -1;
-- 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 @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');