cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)
Devuelve una fila de cambio de red para cada fila de origen cambiada dentro del intervalo de LSN especificado. Es decir, cuando una fila de origen tiene varios cambios durante el intervalo de LSN, la función devuelve una fila única que refleja el contenido final de la fila. Por ejemplo, si una transacción inserta una fila en la tabla de origen y una transacción subsiguiente dentro de intervalo de LSN actualiza una o más columnas en esa fila, la función devuelve solo una fila, que incluye los valores de columna actualizados.
Esta función de enumeración se crea cuando se habilita una tabla de origen para la captura de datos modificados y se especifica seguimientos de cambios en la red. Para habilitar el seguimiento de cambios en la red, la tabla de origen debe tener una clave principal o índice único. El nombre de la función usa y se obtiene del formato cdc.fn_cdc_get_net_changes_capture_instance, donde capture_instance es el valor que se especificó para la instancia de captura cuando la tabla de origen se habilitó para la captura de datos modificados. Para obtener más información, consulte sys.sp_cdc_enable_table (Transact-SQL).
Sintaxis
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
}
Argumentos
from_lsn
El LSN que representa el extremo inferior del intervalo de LSN que se incluirá en el conjunto de resultados. from_lsn es de tipo binary(10).Solo se incluirán en el conjunto de resultados las filas de la tabla de cambios cdc.[capture_instance]_CT cuyo valor de __$start_lsn sea mayor o igual que from_lsn.
to_lsn
El LSN que representa el extremo superior del intervalo de LSN que se incluirá en el conjunto de resultados. to_lsn es de tipo binary(10).Solo se incluirán en el conjunto de resultados las filas de la tabla de cambios cdc.[capture_instance]_CT cuyo valor de __$start_lsn sea menor o igual que from_lsn o igual a to_lsn .
<row_filter_option>:: = { todos | todos con máscara | todos con combinación }
Una opción que rige el contenido de las columnas de metadatos y las filas devueltas en el conjunto de resultados. Puede ser una de las siguientes opciones:todos
Devuelve el LSN del último cambio de la fila y la operación necesaria para aplicar la fila en las columnas de metadatos __$start_lsn y __$operation. La columna __$update_mask tiene siempre el valor NULL.todos con máscara
Devuelve el LSN del último cambio de la fila y la operación necesaria para aplicar la fila en las columnas de metadatos __$start_lsn y $operation. Además, cuando una operación de actualización devuelve ($operation = 4) las columnas capturadas modificadas en la actualización se marcan en el valor devuelto en __$update_mask.todos con combinación
Devuelve el LSN del último cambio realizado en la fila en las columnas de metadatos __$start_lsn. La columna __$operation tendrá uno de estos dos valores: 1 para eliminar y 5 indicar que la operación necesaria para aplicar el cambio es una inserción o una actualización. La columna __$update_mask tiene siempre el valor NULL.Debido a que la lógica para determinar la operación precisa de un cambio determinado agrega mayor complejidad a la consulta, esta opción se ha diseñado para mejorar el rendimiento de las consultas cuando es suficiente indicar que la operación necesaria para aplicar los datos de cambio es una inserción o una actualización, pero no es necesario distinguir explícitamente entre las dos. Esta opción resulta muy útil en entornos de destino donde las operaciones Combinar están directamente disponibles, como en un entorno SQL Server 2008.
Tabla devuelta
Nombre de columna |
Tipo de datos |
Descripción |
---|---|---|
__$start_lsn |
binary(10) |
Número de secuencia de registro (LSN) asociado con la transacción de confirmación para el cambio. Todos los cambios confirmados en la misma transacción comparten el mismo LSN de confirmación. Por ejemplo, si una operación de actualización en la tabla de origen modifica dos columnas en dos filas, la tabla de cambios contendrá cuatro filas, cada una con el mismo valor __$start_lsn. |
__$seqval |
binary(10) |
Valor de secuencia utilizado para ordenar los cambios de fila dentro de una transacción. |
__$operation |
int |
Identifica la operación del lenguaje de manipulación de datos (DML) necesaria para aplicar la fila de datos modificados al origen de datos de destino. Si el valor del parámetro row_filter_option es todos o todos con máscara, el valor de esta columna puede ser uno de los siguientes: 1 = eliminar 2 = insertar 4 = actualizar Si el valor del parámetro row_filter_option es todos con combinación, el valor de esta columna puede ser uno de los siguientes: 1 = eliminar 5 = insertar o actualizar Un valor de 5 indica que no se sabe si la fila ya está presente y solo se tiene que actualizar, o si la fila no está presente y se debe insertar. |
__$update_mask |
varbinary(128) |
Máscara de bits con un bit que corresponde a cada columna capturada identificada para la instancia de captura. Este valor tiene todos los bits definidos establecidos en 1 si __$operation = 1 o 2. Si __$operation = 3 o 4, solo los bits que corresponden a columnas que han cambiado se establecen en 1. |
<columnas de tabla de origen capturadas> |
varía |
Las columnas restantes devueltas por la función son las columnas de la tabla de origen que se identificaron como columnas capturadas cuando se creó la instancia de captura. Si no se especificó ninguna columna en la lista de columnas capturadas, se devuelven todas las columnas de la tabla de origen. |
Permisos
Debe pertenecer al rol fijo de servidor sysadmin o al rol fijo de base de datos db_owner. Para el resto de usuarios, requiere el permiso SELECT en todas las columnas capturadas en la tabla de origen y, si se ha definido un rol de acceso para la instancia de captura, la pertenencia a ese rol de base de datos. Cuando el autor de la llamada no tiene permiso para ver los datos de origen, la función devuelve el error 208 (Nombre de objeto no válido).
Comentarios
Si el intervalo del LSN especificado no se encuentra dentro de la escala temporal del seguimiento de cambios de la instancia de captura, la función devuelve el error 208 (Nombre de objeto no válido).
Ejemplos
En el siguiente ejemplo se usa la función cdc.fn_cdc_get_net_changes_HR_Department para documentar los cambios en la red realizados en la tabla de origen HumanResources.Department durante un determinado intervalo de tiempo.
En primer lugar, se usa la función GETDATE para marcar el inicio del intervalo de tiempo. Después de aplicar varias instrucciones DML a la tabla de origen, se llama de nuevo a la función GETDATE para identificar el final del intervalo de tiempo. La función sys.fn_cdc_map_time_to_lsn se utiliza a continuación para asignar el intervalo de tiempo al intervalo de la consulta de captura de datos modificados limitado por valores de LSN. Por último, se consulta la función cdc.fn_cdc_get_net_changes_HR_Department para obtener los cambios de la red realizados en la tabla de origen durante el intervalo de tiempo. Observe que la fila que se inserta y, a continuación, se elimina no aparece en el conjunto de resultados devuelto por la función. Esto se debe a que una fila que primero se agrega y luego se elimina dentro de una ventana de consulta no genera ningún cambio de la red en la tabla de origen para el intervalo. Antes de ejecutar este ejemplo, primero debe ejecutar el ejemplo B en 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');