Comment activer Change Data Capture (CDC) sur les colonnes nouvellement ajoutées de la table sous-jacente sans désactiver CDC

J'ai une exigence où je veux activer CDC sur les colonnes nouvellement ajoutées de la table, mais je ne peux pas désactiver CDC et l'activer à nouveau. Est-ce que je peux y arriver?

J'ai trouvé une solution où je peux copyr d'anciennes valeurs de tables CDC dans une table temporaire, puis désactiver CDC, puis activer CDC avec un nouveau schéma de table. Copier plus tard les valeurs de la table temporaire dans la nouvelle table CDC et mettre à jour la valeur LSN.

Au lieu de ce qui précède, j'ai besoin d'une solution où je peux inclure la nouvelle colonne dans la table CDC pendant que le CDC est activé.

CDC prend en charge deux instances de tables de capture. Ainsi, vous pouvez faire les étapes suivantes:

  1. Ajouter une nouvelle colonne
  2. Ajouter une nouvelle incitation de capture de CDC
  3. Déplacer datatables de l'ancienne table vers la nouvelle
  4. Désactiver l'ancienne instance de cdc

Cette solution vous empêche d'arrêter la collecte des modifications et vous ne perdrez pas de données.

EXEC sp_cdc_enable_table @source_schema = N'common', @source_name = N'EntityTypes', @role_name = NULL, @filegroup_name = N'CDC', @capture_instance = 'common_EntityTypes' ALTER TABLE common.EntityTypes ADD TestColumn int EXEC sp_cdc_enable_table @source_schema = N'common', @source_name = N'EntityTypes', @role_name = NULL, @filegroup_name = N'CDC', @capture_instance = 'common_EntityTypes2' INSERT INTO cdc.common_EntityTypes2_CT (__$start_lsn, __$end_lsn,__$seqval,__$operation,__$update_mask,Id,Name) SELECT __$start_lsn, __$end_lsn, __$seqval, __$operation, __$update_mask, Id, Name FROM cdc.common_EntityTypes_CT EXEC sp_cdc_disable_table @source_schema = N'common', @source_name = N'EntityTypes', @capture_instance = 'common_EntityTypes' 

La solution ci-dessus fonctionne bien quand vous avez une seule instance sur la table cible, mais si vous avez déjà deux instances, vous devrez peut-être réfléchir un peu plus loin et utiliser un peu de planification.

La question de la perte de données est pertinente, mais vous pourriez envisager cette question lors de la design du process CDC, un élément très pertinent étant, quel est le point final pour datatables? Par exemple, si vous utilisez une solution BI, peut-être un entrepôt ou une database OLAP simple comme un data-mart pour une solution de reporting, vous pouvez envisager d'introduire des windows de maintenance ou d'utiliser une window de maintenance actuelle. Le process est simple et pas très différent de la réponse de Backs:

  1. Transférer toutes datatables _CT actuelles dans le point final.

  2. Désactiver l'instance actuelle sur la table (sp_cdc_disable_table)

  3. Activez à nouveau l'instance avec la list de colonnes mise à jour (sp_cdc_enable_table)

Cela permet d'effectuer les modifications même si deux instances ciblent déjà la même table sans perte de données client.

Remarque: l'utilisation du paramètre de list de colonnes n'est pas vraiment une exigence (si vous souhaitez capturer toutes les colonnes), mais il peut être préférable d'être cohérent lorsque d'autres développeurs peuvent avoir besoin d'examiner le code. Cependant, il est tout aussi facile d'get ces données via les tables système cdc.X.