Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment activer la capture de données modifiées (CDC) sur toute la table OU activer CDC sur la table avec la liste des colonnes dans SQL Server

Scénario :

Parfois, nous devons activer CDC sur la table, y compris toutes les colonnes OU activer CDC sur la table avec un ensemble de colonnes. Le SP peut effectuer les deux tâches en fonction des paramètres fournis. Cette procédure stockée sera utilisée lorsque CDC n'est déjà pas activé sur la table. Si Change Data Capture (CDC) est déjà activé sur Table , la procédure stockée n'effectuera aucune action.

Solution :

La procédure stockée ci-dessous peut être utilisée pour activer CDC sur toutes les colonnes d'une table ou sur n'importe quelle colonne choisie.
 
 
 
UTILISER [DatabaseName]GO
/*--------------------------------------------- -------------------------------------------------- ------ Comment exécuter :EXEC usp_EnableCdcOnTableWithOrWithoutColumnList @pSchemaName,@pTableName,@pColumnListEnable CDC sur la table avec toutes les colonnesExemple : usp_EnableCdcOnTableWithOrWithoutColumnList 'SchemaName', 'TableName', NULLEnable CDC sur la table avec des colonnes donnéesExemple : usp_EnableCdcOnTableWithOrWithout'ColumnList NomTable','Col1,Col2'------------------------------------------------------- -------------------------------------------------- -------------*/

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[Usp_enablecdcontablewithorwithoutcolumnlist] 
@pSchemaName VARCHAR(50),--> Indiquez le nom du schéma où la table existe
@pTableName VARCHAR(100),--> TableName pour ACTIVER CDC ON.
@pColumnList VARCHAR(1000)--> ColumnList par exemple.'col1,col2'
AS BEGIN --DECLARE LOCAL VARIABLES DECLARE @vSQLStatment NVARCHAR(MAX) DECLARE @vSQLEnableCDC NVARCHAR(MAX) DECLARE @vXML XML ; DECLARE @vCDCEnableInd INT DECLARE @vColumnCount INT -- SI CDC DÉJÀ ACTIVÉ SET @vCDCEnableInd=(SELECT is_tracked_by_cdc FROM sys.tables WHERE name =@pTableName) -- CHECK IF CORRECT TABLE NAME IS PROVIDED IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =@pTableName) BEGIN PRINT ' La table donnée n'existe pas dans la base de données : :' + @pTableName END -- ACTIVER CDC AVEC TOUTES LES COLONNES SI AUCUNE COLONNE N'EST FOURNIE AUTREMENT COMMENCER SI @pColumnList EST NULL ET @vCDCEnableInd =1 COMMENCER L'IMPRESSION 'CDC est déjà activé sur ::' + @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 activé sur ::' + @pTableName + ' pour toutes les colonnes' END -- IF COLUMN LIST IS PROVIDED FOR CDC IF ( LEN(@pColumnList)> 0 ) BEGIN SET @vXML=CAST(' ' + REMPLACER(@pColumnList, ',', '') + '' AS XML); -- VÉRIFIER SI UN NOM DE COLONNE INCORRECT EST FOURNI SELECT @vColumnCount =COUNT(*) FROM @vXML.nodes('/a') AS R(nref) WHERE NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS I WHERE I.TABLE_NAME =@ pTableName AND I.COLUMN_NAME =nref.value('.', 'nvarchar(50)')) IF ( @vColumnCount <> 0 ) PRINT ' La liste des colonnes fournies ne se trouve pas dans la table source.Vérifiez la liste des colonnes' -- IF Toutes les colonnes existent dans la table source, Activer CDC IF ( @vColumnCount =0 AND @vCDCEnableInd =1 ) BEGIN PRINT 'Le CDC est déjà activé pour cette table.' END IF ( @vColumnCount =0 AND @vCDCEnableInd =0 ) BEGIN --Activer 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 activé sur ::' + @pTableName + ' pour ' + @pColumnList + ' Colonnes .' FIN FIN FIN FIN