cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Devuelve una fila de cambio neto por cada fila de origen cambiada dentro del intervalo de números de secuencia de registro (LSN) especificado.Returns one net change row for each source row changed within the specified Log Sequence Numbers (LSN) range.

Espere, ¿qué es un LSN?Wait, what is an LSN? Todos los registros en el registro de transacciones de SQL Server se identifica mediante un número de secuencia de registro (LSN).Every record in the SQL Server transaction log is uniquely identified by a log sequence number (LSN). Los LSN se ordenan de manera que si LSN2 es mayor que LSN1, se produjo el cambio descrito por la entrada del registro que hace referencia LSN2 después del cambio descrito por la entrada del registro LSN.LSNs are ordered such that if LSN2 is greater than LSN1, the change described by the log record referred to by LSN2 occurred after the change described by the log record LSN.

El LSN de una entrada de registro donde se produjo un evento importante puede ser útil para generar secuencias de restauración correcta.The LSN of a log record where a significant event occurred can be useful for constructing correct restore sequences. Dado que los LSN se ordenan, se puede comparar de igualdad y desigualdad (es decir, <, >, =, <=, > =).Because LSNs are ordered, you can compare them for equality and inequality (that is, <, >, =, <=, >=). Estas comparaciones son útiles para generar secuencias de restauración.Such comparisons are useful when constructing restore sequences.

Cuando una fila de origen tiene varios cambios durante el intervalo de LSN, se devuelve una fila única que refleja el contenido final de la fila por la función de enumeración que se describen a continuación.When a source row has multiple changes during the LSN range, a single row that reflects the final content of the row is returned by the enumeration function described below. Por ejemplo, si una transacción inserta una fila en la tabla de origen y una transacción subsiguiente dentro del intervalo LSN actualiza una o varias columnas de esa fila, la función devuelve solo uno fila, que incluye los valores de columna actualizada.For example, if a transaction inserts a row in the source table and a subsequent transaction within the LSN range updates one or more columns in that row, the function returns only one row, which includes the updated column values.

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.This enumeration function is created when a source table is enabled for change data capture and net tracking is specified. Para habilitar el seguimiento de cambios netos, la tabla de origen debe tener una clave principal o índice único.To enable net tracking, the source table must have a primary key or unique index. El nombre de función y se obtiene del formato cdc.fn_cdc_get_net_changes_ se utilizacapture_instance, donde capture_instance es el valor especificado para la instancia de captura cuando la tabla de origen estaba habilitado para la captura de datos modificados.The function name is derived and uses the format cdc.fn_cdc_get_net_changes_capture_instance, where capture_instance is the value specified for the capture instance when the source table was enabled for change data capture. Para obtener más información, consulte sys.sp_cdc_enable_table (Transact-SQL).For more information, see sys.sp_cdc_enable_table (Transact-SQL).

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

  
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  
}  

ArgumentosArguments

from_lsnfrom_lsn
El LSN que representa el extremo inferior del rango de LSN que se va a incluir en el conjunto de resultados.The LSN that represents the low endpoint of the LSN range to include in the result set. from_lsn es binary (10).from_lsn is binary(10).

Solo las filas de la cdc.[ capture_instance]_CT cambiar la tabla con un valor de __ $ start_lsn sea mayor o igual que from_lsn se incluyen en el conjunto de resultados.Only rows in the cdc.[capture_instance]_CT change table with a value in __$start_lsn greater than or equal to from_lsn are included in the result set.

to_lsnto_lsn
El LSN que representa el extremo superior del rango de LSN que se va a incluir en el conjunto de resultados.The LSN that represents the high endpoint of the LSN range to include in the result set. to_lsn es binary (10).to_lsn is binary(10).

Solo las filas de la cdc.[ capture_instance]_CT cambiar la tabla con un valor en __ $ start_lsn sea menor o igual que from_lsn o igual que to_lsn se incluyen en el conjunto de resultados.Only rows in the cdc.[capture_instance]_CT change table with a value in __$start_lsn less than or equal to from_lsn or equal to to_lsn are included in the result set.

< row_filter_option > :: = {todos | todos con máscara | todos con combinación}<row_filter_option> ::= { all | all with mask | all with merge }
Una opción que rige el contenido de las columnas de metadatos y las filas devueltas en el conjunto de resultados.An option that governs the content of the metadata columns as well as the rows returned in the result set. Puede ser una de las siguientes opciones:Can be one of the following options:

allall
Devuelve el LSN del último cambio realizado en la fila y la operación necesaria para aplicar la fila en las columnas de metadatos __ $start_lsn y _ _$operation.Returns the LSN of the final change to the row and the operation needed to apply the row in the metadata columns __$start_lsn and __$operation. La columna _ _$update_mask es siempre NULL.The column __$update_mask is always NULL.

all with maskall with mask
Devuelve el LSN del último cambio realizado en la fila y la operación necesaria para aplicar la fila en las columnas de metadatos __ $start_lsn y _ _$operation.Returns the LSN of the final change to the row and the operation needed to apply the row in the metadata columns __$start_lsn and __$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.In addition, when an update operation returns (__$operation = 4) the captured columns modified in the update are marked in the value returned in __$update_mask.

todos con combinaciónall with merge
Devuelve el LSN del último cambio realizado en la fila en las columnas de metadatos __$start_lsn.Returns the LSN of the final change to the row in the metadata columns __$start_lsn. La columna _ _$operation será uno de dos valores: 1 para eliminar y 5 para indicar que la operación necesaria para aplicar el cambio es una inserción o una actualización.The column __$operation will be one of two values: 1 for delete and 5 to indicate that the operation needed to apply the change is either an insert or an update. La columna _ _$update_mask es siempre NULL.The column __$update_mask is always 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.Because the logic to determine the precise operation for a given change adds to query complexity, this option is designed to improve query performance when it is sufficient to indicate that the operation needed to apply the change data is either an insert or an update, but it is not necessary to explicitly distinguish between the two. Esta opción resulta muy útil en entornos de destino donde las operaciones Combinar están directamente disponibles, como en un entorno SQL Server 2017SQL Server 2017.This option is most attractive in target environments where a merge operation is available directly, such as a SQL Server 2017SQL Server 2017 environment.

Tabla devueltaTable Returned

Nombre de columnaColumn name Tipo de datosData type DescripciónDescription
$start_lsn$start_lsn binary(10)binary(10) Número de secuencia de registro (LSN) asociado con la transacción de confirmación para el cambio.LSN associated with the commit transaction for the change.

Todos los cambios confirmados en la misma transacción comparten el mismo LSN de confirmación.All changes committed in the same transaction share the same commit LSN. 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 uno con el mismo start_lsnvalue$ de __.For example, if an update operation on the source table modifies two columns in two rows, the change table will contain four rows, each with the same __$start_lsnvalue.
$operation$operation intint 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.Identifies the data manipulation language (DML) operation needed to apply the row of change data to the target data source.

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:If the value of the row_filter_option parameter is all or all with mask, the value in this column can be one of the following values:

1 = eliminar1 = delete

2 = insertar2 = insert

4 = actualizar4 = update

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:If the value of the row_filter_option parameter is all with merge, the value in this column can be one of the following values:

1 = eliminar1 = delete
$update_mask$update_mask varbinary(128)varbinary(128) Máscara de bits con un bit que corresponde a cada columna capturada identificada para la instancia de captura.A bit mask with a bit corresponding to each captured column identified for the capture instance. Este valor tiene todos los bits definidos establecidos en 1 si __$operation = 1 o 2.This value has all defined bits set to 1 when __$operation = 1 or 2. Cuando _ _$operation = 3 o 4, solo los bits que corresponden a columnas que han cambiado se establecen en 1.When __$operation = 3 or 4, only those bits corresponding to columns that changed are set to 1.
<columnas de la tabla de origen capturadas><captured source table columns> varíavaries 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.The remaining columns returned by the function are the columns from the source table that were identified as captured columns when the capture instance was created. Si no se especificó ninguna columna en la lista de columnas capturadas, se devuelven todas las columnas de la tabla de origen.If no columns were specified in the captured column list, all columns in the source table are returned.

PermisosPermissions

Debe pertenecer al rol fijo de servidor sysadmin o al rol fijo de base de datos db_owner.Requires membership in the sysadmin fixed server role or db_owner fixed database role. 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.For all other users, requires SELECT permission on all captured columns in the source table and, if a gating role for the capture instance was defined, membership in that database role. 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).When the caller does not have permission to view the source data, the function returns error 208 (Invalid object name).

ComentariosRemarks

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).If the specified LSN range does not fall within the change tracking timeline for the capture instance, the function returns error 208 (Invalid object name).

Las modificaciones en el identificador único de una fila hará que fn_cdc_get_net_changes mostrar el comando de actualización inicial con una eliminación y, a continuación, insertar comandos en su lugar.Modifications on the unique identifier of a row will cause fn_cdc_get_net_changes to show the initial UPDATE command with a DELETE and then INSERT command instead. Este comportamiento es necesario realizar un seguimiento de la clave antes y después del cambio.This behavior is necessary to track the key both before and after the change.

EjemplosExamples

En el ejemplo siguiente se usa la función cdc.fn_cdc_get_net_changes_HR_Department para notificar los cambios netos realizados en la tabla de origen HumanResources.Department durante un intervalo de tiempo específico.The following example uses the function cdc.fn_cdc_get_net_changes_HR_Department to report the net changes made to the source table HumanResources.Department during a specific time interval.

En primer lugar, se usa la función GETDATE para marcar el inicio del intervalo de tiempo.First, the GETDATE function is used to mark the beginning of the time interval. 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.After several DML statements are applied to the source table, the GETDATE function is called again to identify the end of the time interval. La función sys.fn_cdc_map_time_to_lsn , a continuación, se usa para asignar el intervalo de tiempo para un intervalo de consulta de captura de datos modificados limitado por valores LSN.The function sys.fn_cdc_map_time_to_lsn is then used to map the time interval to a change data capture query range bounded by LSN values. 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.Finally, the function cdc.fn_cdc_get_net_changes_HR_Department is queried to obtain the net changes to the source table for the time interval. 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.Notice that the row that is inserted and then deleted does not appear in the result set returned by the function. 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.This is because a row that is first added and then deleted within a query window produces no net change on the source table for the interval. Antes de ejecutar este ejemplo, primero debe ejecutar el ejemplo B en sys.sp_cdc_enable_table (Transact-SQL).Before you run this example, you must first run example B in sys.sp_cdc_enable_table (Transact-SQL).

USE AdventureWorks2012;  
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');  

Vea tambiénSee Also

cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL) cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)
sys.fn_cdc_map_time_to_lsn (Transact-SQL) sys.fn_cdc_map_time_to_lsn (Transact-SQL)
sys.sp_cdc_enable_table (Transact-SQL) sys.sp_cdc_enable_table (Transact-SQL)
sys.sp_cdc_help_change_data_capture (Transact-SQL) sys.sp_cdc_help_change_data_capture (Transact-SQL)
Acerca de la captura de datos modificados (SQL Server)About Change Data Capture (SQL Server)