sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo habilitar la captura de datos modificados (CDC) en toda la tabla O habilitar CDC en la tabla con la lista de columnas en SQL Server

Escenario:

En algún momento tenemos el requisito de Habilitar CDC en la tabla, incluidas todas las columnas O habilitar CDC en la tabla con un conjunto de columnas. El SP puede realizar ambas tareas según los parámetros proporcionados. Este procedimiento almacenado se utilizará cuando CDC ya no esté habilitado en la tabla. Si la captura de datos modificados (CDC) ya está habilitada en la tabla, el procedimiento almacenado no realizará ninguna acción.

Solución:

El procedimiento almacenado a continuación se puede usar para habilitar CDC en todas las columnas de una tabla o en cualquier columna elegida.
 
 
 
USAR [Nombre de la base de datos]IR
/*--------------------------------------------- -------------------------------------------------- ------Cómo ejecutar:EXEC usp_EnableCdcOnTableWithOrWithoutColumnList @pSchemaName,@pTableName,@pColumnListEnable CDC en la tabla con todas las columnasEjemplo:usp_EnableCdcOnTableWithOrWithoutColumnList 'SchemaName','TableName',NULLEnable CDC en la tabla con las columnas dadasEjemplo:usp_EnableCdcOnTableMaWith'OrWithout NombreTabla','Col1,Col2'------------------------------------------ -------------------------------------------------- -------------*/
@pSchemaName VARCHAR(50),--> Proporcione el nombre del esquema donde existe la tabla
@pTableName VARCHAR(100),--> TableName para HABILITAR CDC ENCENDIDO.
@pColumnList VARCHAR(1000)--> ColumnList, por ejemplo, 'col1, col2'
COMO COMENZAR --DECLARAR VARIABLES LOCALES DECLARAR @vSQLStatment NVARCHAR(MAX) DECLARAR @vSQLEnableCDC NVARCHAR(MAX) DECLARAR @vXML XML; DECLARE @vCDCEnableInd INT DECLARE @vColumnCount INT -- SI CDC YA HABILITADO SET @vCDCEnableInd=(SELECCIONE is_tracked_by_cdc FROM sys.tables WHERE name =@pTableName) -- COMPRUEBE SI SE PROPORCIONA EL NOMBRE CORRECTO DE LA TABLA SI NO EXISTE (SELECCIONE 1 DE INFORMACION_ESQUEMA.COLUMNAS WHERE TABLE_NAME =@pTableName) BEGIN PRINT ' La tabla dada no existe en la base de datos::' + @pTableName END -- HABILITAR CDC CON TODAS LAS COLUMNAS SI NO SE PROPORCIONAN COLUMNAS MÁS BEGIN IF @pColumnList IS NULL AND @vCDCEnableInd =1 BEGIN PRINT 'CDC ya está habilitado en ::' + @pTableName END IF @pColumnList IS NULL AND @vCDCEnableInd =0 BEGIN SELECT @vSQLStatment ='EXEC sys.sp_cdc_enable_table @source_sche ma =''' + @pSchemaName + ''', @source_name =''' + @pTableName + ''', @role_name =null;' EXEC sp_executesql @vSQLStatment PRINT ' CDC habilitado en ::' + @pTableName + ' para todas las columnas' FIN -- SI LA LISTA DE COLUMNAS SE PROPORCIONA PARA CDC IF ( LEN(@pColumnList)> 0 ) BEGIN SET @vXML=CAST(' ' + REEMPLAZAR(@pColumnList, ',', '') + '' COMO XML); -- COMPRUEBE SI SE PROPORCIONA UN NOMBRE DE COLUMNA incorrecto SELECCIONE @vColumnCount =COUNT(*) FROM @vXML.nodes('/a') AS R(nref) DONDE NO EXISTE (SELECCIONE 1 DE INFORMACION_ESQUEMA.COLUMNAS I DONDE I.TABLE_NAME =@ pTableName AND I.COLUMN_NAME =nref.value('.', 'nvarchar(50)')) IF ( @vColumnCount <> 0 ) PRINT ' La lista de columnas proporcionada no sale en la tabla de origen. Verifique ColumnList' -- SI Todas las columnas existen en la tabla de origen, habilite CDC IF ( @vColumnCount =0 AND @vCDCEnableInd =1 ) BEGIN PRINT ' El CDC ya está habilitado para esta tabla.' END IF ( @vColumnCount =0 AND @vCDCEnableInd =0 ) BEGIN --Habilitar CDC SET @vSQLEnableCDC='EXEC sys.sp_cdc_enable_table @source_schema=''' + @pSchemaName + ''',@source_name=''' + @pTableName + ''', @role_name=NULL, @captured_column_list=''' + @pColumnList + '''' EXEC (@vSQLEnableCDC) PRINT ' CDC habilitado en ::' + @pTableName + ' for ' + @pColumnList + ' Columnas .' FIN FIN FIN FIN