Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Managed Instance
Cet article explique les limitations connues, les problèmes et les erreurs liés à la capture de données modifiées (CDC) pour SQL Server et Azure SQL Managed Instance.
Pour la base de données Azure SQL, consultez Problèmes connus avec CDC dans la base de données Azure SQL.
Modifier les métadonnées
Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les CDC schema, les tables des changements, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.
Tous les objets dans sys.objects dont is_ms_shipped la propriété est définie sur 1 ne doivent pas être modifiés.
SELECT name AS object_name
,SCHEMA_NAME(schema_id) AS schema_name
,type_desc
,is_ms_shipped
FROM sys.objects
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'
Différences de classement
Il est important de noter que, dans certains cas, les classements peuvent ne pas être les mêmes dans la base de données et dans les colonnes d’une table configurée pour la capture des changements de données. CDC utilise un stockage temporaire pour remplir les tables secondaires. Si une table a des colonnes char ou varchar avec des classements différents de ceux de la base de données, et si ces colonnes stockent des caractères non-ASCII (par exemple des caractères DBCS codés sur deux octets), la capture des changements de données peut ne pas être en mesure de maintenir la cohérence entre les données modifiées et les données des tables de base. Cela est dû au fait que les variables de stockage temporaire ne peuvent pas être associées à des classements.
Envisagez plutôt l’une des approches suivantes pour vérifier que les données modifiées sont cohérentes avec celles des tables de base :
Utilisez le type de données nchar ou nvarchar pour les colonnes contenant des données non ASCII.
Vous pouvez également utiliser le même classement pour les colonnes et pour la base de données.
Par exemple, si vous avez une base de données qui utilise le classement SQL_Latin1_General_CP1_CI_AS, considérez la table suivante :
CREATE TABLE T1(
C1 INT PRIMARY KEY,
C2 VARCHAR(10) collate Chinese_PRC_CI_AI)
La capture des changements de données peut échouer à capturer les données binaires de la colonne C2, car son classement est différent (Chinese_PRC_CI_AI). Utilisez nvarchar pour éviter ce problème :
CREATE TABLE T1(
C1 INT PRIMARY KEY,
C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
)
Récupération de base de données accélérée (ADR) et capture de données modifiées (CDC)
L’activation de la capture de données modifiées (CDC) et de la récupération de base de données accélérée (ADR) pour la même base de données n’est pas prise en charge dans SQL Server 2019 (15.x). L’activation de CDC et d’ADR est prise en charge dans les versions ultérieures de SQL Server, à compter de SQL Server 2022 (16.x) Mise à jour cumulative 18.
Lorsque vous activez la CDC, la fonctionnalité de troncation de journal agressive d’ADR est désactivée. En effet, l’analyse CDC accède au journal des transactions de base de données. Les transactions actives conservent la troncation du journal des transactions jusqu’à ce que la transaction soit commitée et que la capture des changements de données la rattrape, ou que la transaction soit abandonnée. Si vous activez cdc sur une base de données où ADR est activé, vous pouvez observer une utilisation plus élevée du journal des transactions. Assurez-vous qu'un espace suffisant de journal des transactions est disponible pour les besoins de toutes vos charges de travail.
L'activation de la capture de données de changements (CDC) échoue si le schéma ou l'utilisateur nommé cdc existe déjà
Lorsque vous activez la CDC sur une base de données, un nouveau schéma et un nouvel utilisateur nommé cdc sont créés. Par conséquent, la création manuelle d’un schéma personnalisé ou d’un utilisateur nommé cdc n’est pas recommandée, car elle est réservée à l’utilisation du système.
Si vous avez défini manuellement un schéma personnalisé ou un utilisateur nommé cdc dans votre base de données qui n’est pas lié à CDC, la procédure stockée système sys.sp_cdc_enable_db échoue à activer CDC sur la base de données, avec le message d’erreur suivant.
The database <database_name> cannot be enabled for change data capture because a database user named 'cdc' or a schema named 'cdc' already exists in the current database. These objects are required exclusively by CDC. Drop or rename the user or schema and retry the operation.
Pour résoudre ce problème :
- Supprimez manuellement le schéma
cdcvide et l’utilisateurcdc. Ensuite, la CDC peut être activée avec succès dans la base de données.
La CDC échoue après ALTER COLUMN
Lorsque le type de données d’une colonne sur une table avec capture de données de modification (CDC) est modifié pour une conversion non prise en charge, l’analyse CDC peut entraîner des erreurs après la mise à jour.
Voici des exemples de changements de type de données ALTER COLUMN qui ne sont pas pris en charge lorsque la capture de données modifiées est activée sur une table :
- bigint en int
- char(x), nvarchar(x)ou nvarchar(x) en uniqueidentifier, DATE ou INT
La modification du type de données d’une colonne dans une table activée pour la capture de données modifiées peut entraîner les erreurs suivantes :
- Erreur 241 : échec de la conversion lors de la conversion de la date et/ou de l’heure à partir de la chaîne de caractères.
- Erreur 245 - Échec de la conversion lors de la conversion de la valeur.
- Erreur 8169 : la conversion a échoué lors de la conversion d’une chaîne de caractères en identificateur unique.
La modification de la taille des colonnes d'une table avec capture de données modifiées à l'aide d'instructions DDL peut entraîner des problèmes avec le processus de capture CDC suivant, provoquant les erreurs suivantes :
- Erreur 2628 : les données de chaîne ou binaires sont tronquées dans la table.
- Erreur 8115 - Erreur de dépassement arithmétique lors de la conversion du type de données de bigint en l'int
Rappelez-vous que les données des tables de modification de la CDC sont conservées en fonction des paramètres configurés par l'utilisateur. Par conséquent, avant d’apporter des modifications à la taille des colonnes, vous devez évaluer si la modification est compatible avec les données existantes dans les tables de modification de CDC.
Si le sys.dm_cdc_errors indique que les analyses échouent en raison des erreurs 2628 ou 8115 pour les tables de modification, vous devez d’abord consommer les données de modification des tables affectées. Après cela, vous devez désactiver puis réactiver CDC sur la table pour résoudre efficacement le problème.
L’activation de la capture de données modifiées échoue lorsqu’il existe des déclencheurs CREATE OBJECT
Lorsque vous activez la CDC, une cdc user est créée pour gérer le processus de création de la CDC. Le cdc user exécute un certain nombre de procédures stockées pour activer la CDC, et certaines de ces procédures stockées créent des objets qui déclenchent des déclencheurs CREATE OBJECT existants. Étant donné que cdc user n’a pas l’autorisation d’écrire dans la base de données master, ces procédures stockées CDC échouent avec l’erreur 22830.
Désactivez les déclencheurs CREATE OBJECT avant d’activer la CDC sur une base de données. Réactivez ces déclencheurs après la configuration de la CDC.
Importer une base de données à l'aide des opérations d'importation/exportation et d'extraction/publication au niveau des données
Pour les bases de données SQL compatibles avec la CDC, lorsque vous utilisez SqlPackage, SSDT ou d'autres outils SQL pour importer/exporter ou extraire/publier, le schéma et l'utilisateur cdc sont exclus de la nouvelle base de données. Les autres objets CDC non inclus dans les opérations Import/Export et Extract/Deploy incluent les tables marquées comme is_ms_shipped=1 dans sys.objects.
Même si la CDC n'est pas activée et que vous avez défini un schéma personnalisé ou un utilisateur nommé cdc dans votre base de données, celui-ci sera également exclu des opérations Importer/Exporter et Extraire/Déployer pour importer/mettre en place une nouvelle base de données.
Basculement de partition avec des variables
L’utilisation de variables avec basculement de partitions sur des bases de données ou des tables avec capture des changements de données (CDC) n’est pas prise en charge pour l’instruction ALTER TABLE ... SWITCH TO ... PARTITION .... Pour en savoir plus, consultez Limitations du basculement de partition.
Opérations en ligne
Les instructions DDL en ligne ne sont pas prises en charge.
Dans Azure SQL Managed Instance et les versions de SQL Server avant SQL Server 2025 (17.x), les instructions ALTER TABLE online DDL ne sont pas prises en charge lorsque la capture de données modifiées est activée sur une base de données.
Les opérations d’index en ligne ne sont pas prises en charge
Les opérations d’index en ligne ne sont pas prises en charge lorsque la capture de données modifiées est activée sur une base de données. Vous pouvez rencontrer l’erreur 18773 : « Impossible de localiser les enregistrements d’informations textuelles pour la colonne «%.*ls », ID %d lors de la construction de la commande. »
Contraintes par défaut sur les colonnes ajoutées
Lorsque la capture de données modifiées est activée sur une table et qu’une colonne non nullable avec une contrainte par défaut est ajoutée, les données de ligne existantes ont la valeur de la contrainte par défaut. Toutefois, CDC utilisera NULL au lieu de la valeur par défaut pour les lignes existantes. Cela s’applique uniquement aux données présentes avant l’application du DDL. Pour contourner ce problème, émettez des instructions sans modification UPDATE sur des lignes existantes ou effectuez une opération ALTER INDEX ... REBUILD sur l’index clusterisé de la table. Utilisez ALTER TABLE ... REBUILD sur le tas si aucun index clusterisé n’est présent.
Résolution des problèmes
Cette section décrit les étapes à suivre pour résoudre les erreurs associées à la CDC sur SQL Server et Azure SQL Managed Instance. Les erreurs liées à la CDC peuvent entraver le bon fonctionnement du processus de saisie et entraîner l’expansion du journal des transactions de la base de données.
Pour examiner ces erreurs, vous pouvez interroger la vue de gestion dynamique sys.dm_cdc_errors. Si sys.dm_cdc_errors vue de gestion dynamique retourne des erreurs, passez en revue les informations de résolution des problèmes suivantes.
Remarque
Pour plus d’informations sur un code d’erreur particulier, consultez les Événements et erreurs du moteur de base de données.
Voici les différentes catégories de résolution des problèmes incluses dans cette section :
| Catégorie | Descriptif |
|---|---|
| Métadonnées modifiées | Inclut des informations sur la façon d’atténuer les problèmes liés à la CDC quand la table suivie a été modifiée ou supprimée. |
| Gestion de l’espace de base de données | Inclut des informations sur la façon d’atténuer les problèmes lorsque l’espace de la base de données a été épuisé. |
| Limitations du CDC | Inclut des informations sur la façon d’atténuer les problèmes causés par les limitations de la CDC. |
Métadonnées modifiées
Erreur 200/208 : nom d’objet non valide
Cause : l’erreur peut se produire lorsque les métadonnées de la CDC ont été supprimées. Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les
CDC schema, les tables des changements, les procédures stockées système CDC, les autorisationscdc userpar défaut (sys.database_principals) ou renommer lecdc user.Recommandation : Pour résoudre ce problème, vous devez désactiver et réactiver la CDC de votre base de données. Quand une base de données est activée pour la capture des données modifiées, le schéma CDC, l’utilisateur CDC, les tables de métadonnées et d’autres objets système sont créés pour la base de données.
Remarque
Les objets trouvés dans l’affichage catalogue système sys.objects avec is_ms_shipped=1 and schema_name='cdc' ne doivent pas être modifiés ni supprimés.
Erreur 1202 : le principal de base de données n’existe pas ou l’utilisateur n’est pas membre
Cause : L’erreur peut se produire quand
cdc usera été supprimé. Pour que la CDC fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées de CDC telles que les tables de changementCDC schema, les procédures stockées du système CDC, les autorisations par défautcdc userou renommer lecdc user.Recommandation : vérifiez que l’utilisateur
cdcexiste dans votre base de données et dispose également du rôledb_ownerattribué. Pour créer l’utilisateurcdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.
Erreur 15517 : impossible d’exécuter en tant que principal de base de données, car le principal n’existe pas
Cause : ce type de principal ne peut pas être impersonné ou vous n’avez pas l’autorisation. L’erreur peut se produire lorsque les métadonnées CDC ont été supprimées ou qu’elles ne font plus partie du rôle
db_owner. Pour que la CDC fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées de CDC telles que les tables de changementCDC schema, les procédures stockées du système CDC, les autorisations par défautcdc userou renommer lecdc user.Recommandation : vérifiez que l’utilisateur
cdcexiste dans votre base de données et dispose également du rôledb_ownerattribué. Pour créer l’utilisateurcdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.
Erreur 18807 : impossible de trouver un ID d’objet pour la table système de réplication
Cause : cette erreur se produit lorsque SQL Server ne peut pas trouver ou accéder à la table système de réplication « %s ». Cela peut être dû au fait que la table est manquante ou inaccessible. Pour que la CDC fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées de CDC telles que les tables de changement
CDC schema, les procédures stockées du système CDC, les autorisations par défautcdc userou renommer lecdc user.Recommandation : vérifiez que la table système existe et qu'elle est accessible en l’interrogeant directement. Interrogez le catalogue système sys.objects, définissez la clause de prédicat avec
is_ms_shipped=1 and schema_name='cdc'pour répertorier tous les objets liés à CDC. Si la requête ne retourne aucun objet, vous devez désactiver puis réactiver la CDC pour votre base de données. L’activation de la capture de données modifiées pour une base de données crée le schéma cdc, l'utilisateur cdc, les tables de métadonnées et d’autres objets système pour la base de données.
Erreur 21050 : seuls les membres du rôle serveur fixe sysadmin ou db_owner peuvent effectuer cette opération
Cause : Le a été supprimé du rôle de base de données
cdc userou du rôle serveurdb_owner.Recommandation : vérifiez que le rôle
cdc userest attribué audb_owner. Pour créer l’utilisateurcdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.
Erreur 22830 : Impossible de mettre à jour les métadonnées qui indiquent que la base de données <database name> est activée pour la capture de données modifiées. L’échec s’est produit lors de l’exécution de la commande <CDC stored procedure name>.
Cause : cette erreur se produit lorsqu’un
CREATE OBJECTdéclencheur existe dans la base de données ou sur le serveur. Lorsque vous activez la CDC, unecdc userest créée pour gérer le processus de création de la CDC. Lecdc userexécute un certain nombre de procédures stockées pour activer la CDC, et certaines de ces procédures stockées créent des objets qui déclenchent des déclencheursCREATE OBJECTexistants. Étant donné quecdc usern’a pas l’autorisation d’écrire dans la base de donnéesmaster, ces procédures stockées CDC échouent avec l’erreur 22830.Recommandation : avant d’activer la capture des changements de données (CDC) sur une base de données, désactivez les déclencheurs
CREATE OBJECT. Réactivez ces déclencheurs après la configuration de la CDC.
Gestion de l’espace de base de données
Erreur 1105 : impossible d’allouer de l’espace pour l’objet dans la base de données, car le groupe de fichiers est plein
Cause : cette erreur se produit lorsque le groupe de fichiers principal d’une base de données manque d’espace et que SQL Server ne parvient pas à allouer plus d’espace pour un objet (par exemple, une table ou un index) dans ce groupe de fichiers.
Recommandation : pour résoudre ce problème, supprimez toutes les données inutiles de votre base de données afin de libérer de l’espace. Identifiez les tables, index ou autres objets inutilisés dans le groupe de fichiers qui peuvent être supprimés en toute sécurité. Surveiller de près l’utilisation de l’espace, pour plus d’informations, consultez Gérer l’espace des fichiers pour les bases de données dans Azure SQL Database
Si la suppression des données/objets inutiles n'est pas envisageable, pensez à allouer plus d'espace au journal des transactions de votre base de données. Pour plus d'informations sur la gestion du journal des transactions, consultez le Guide d'architecture et de gestion du journal des transactions de SQL Server.
Limitations de CDC
Erreur 241 - Échec de la conversion lors de la conversion de la date et/ou de l’heure à partir de la chaîne de caractères
Cause : cette erreur se produit lorsque ALTER COLUMN est effectué sur un type de données date et que la table a le CDC activé. Par exemple, si une table a une colonne nvarchar et que vous changez le type de données en date (par exemple avec
ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), vous pourriez voir cette erreur dans la DMV sys.dm_cdc_errors. L’erreur 241 est due à une conversion de données non prise en charge dans la table de modifications, même si laALTERcommande de la table source réussit.Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver la capture de données modifiées avant de modifier la colonne, puis réactiver la capture de données modifiées après la
ALTER COLUMNmodification.
Erreur 245 - Échec de la conversion lors de la conversion de la valeur de la chaîne en int
Cause : cette erreur se produit lorsque la commande ALTER COLUMN est émise pour modifier le type de données d'une colonne lorsque la table a CDC activé. Par exemple, si une table contient une colonne nvarchar et que vous modifiez le type de données en int, vous pourriez observer cette erreur dans la vue de gestion dynamique
ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL. L’erreur 245 est due à une conversion de données non prise en charge dans la table de modifications, même si laALTERcommande de la table source réussit.Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver la capture de données modifiées avant de modifier la colonne, puis réactiver la capture de données modifiées après la
ALTER COLUMNmodification.
Erreur 913 - Échec du processus de capture CDC lors du traitement des modifications d’une table avec le type de données CLR système
Cause : Cette erreur se produit lors de l'activation de la capture CDC sur une table avec un type de données CLR du système. Après avoir effectué des modifications DML, on réalise ensuite des modifications DDL sur la même table, tandis que le travail de capture CDC traite les changements liés à d'autres tables.
Recommandation : les étapes recommandées sont de mettre DML au repos, d’exécuter une tâche de capture pour traiter les modifications, d’exécuter DDL pour la table, d’exécuter une tâche de capture pour traiter les modifications DDL, puis de réactiver le traitement DML. Pour plus d'informations, consultez l'échec du travail de capture CDC pendant le traitement des modifications d'une table avec le type de données CLR système (géométrie, géographie ou hierarchyid).
Erreur 2628 : les données binary ou String seront tronquées dans la table
Cause : la modification de la taille des colonnes d’une table avec CDC à l’aide d’instructions DDL peut entraîner des problèmes avec le processus de capture CDC suivant. La sys.dm_cdc_errors vue de gestion dynamique (DMV) est utile pour vérifier les problèmes signalés liés au CDC, comme les erreurs numéro 2628 et 8115.
Recommandation : avant d’apporter des modifications à la taille des colonnes, vous devez évaluer si la modification est compatible avec les données existantes dans les tables de modification de CDC. Pour résoudre ce problème, vous devez désactiver et réactiver la CDC pour votre base de données. Pour plus d’informations sur l’activation de la CDC pour une base de données ou une table, consultez Activer la CDC pour une base de données et Activer la CDC pour une table.
Erreur 8115 - Erreur de dépassement arithmétique lors de la conversion du type de données de bigint en int
Cause : cette erreur se produit lorsqu'un DDL ALTER COLUMN est exécuté sur une table compatible CDC, ce qui entraîne une diminution de la précision de la colonne (par exemple, en modifiant le type de données de la colonne de bigint à int). La colonne de précision réduite ne peut pas contenir les valeurs présentes dans la table de modifications.
Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver la capture de données modifiées avant d’exécuter la
ALTER COLUMNcommande, puis réactiver la capture de données modifiées après laALTER COLUMNmodification.
Erreur 8169 - Échec de la conversion lors de la conversion d’une chaîne de caractères en uniqueidentifier
Cause : cette erreur se produit lorsqu’une commande ALTER COLUMN est émise pour modifier le type de données d’une colonne lorsque la table est activée. Par exemple, si une table a une colonne char(x),nvarchar(x), nvarchar(x) et que vous modifiez le type de données en uniqueidentifier (par exemple :
ALTER TABLE table_name ALTER COLUMN [column_name] uniqueidentifier), vous pouvez voir cette erreur dans la vue de gestion dynamique (DMV) sys.dm_cdc_errors. L’erreur 8169 indique une conversion de données non prise en charge dans la table de modifications, même si la commande ALTER sur la table source réussit.Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver la capture de données modifiées avant d’exécuter la
ALTER COLUMNcommande, puis réactiver la capture de données modifiées après laALTER COLUMNmodification.
Créer un utilisateur et attribuer un rôle
Si cdc user a été supprimé, vous pouvez ajouter à nouveau manuellement l’utilisateur.
Utilisez le script T-SQL suivant pour créer un utilisateur (cdc) et attribuer le rôle approprié pour le même (db_owner).
IF NOT EXISTS
(
SELECT *
FROM sys.database_principals
WHERE NAME = 'cdc'
)
BEGIN
CREATE USER [cdc]
WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END
EXEC sp_addrolemember 'db_owner', 'cdc';
Vérifier et ajouter des appartenance à un rôle
Pour vérifier si l’utilisateur cdc appartient au rôle sysadmin ou db_owner, exécutez la requête T-SQL suivante :
EXECUTE AS USER = 'cdc';
SELECT is_srvrolemember('sysadmin'), is_member('db_owner');
Si l’utilisateur cdc n’appartient pas à un rôle, exécutez la requête T-SQL suivante pour ajouter un rôle db_owner à l’utilisateur cdc.
EXEC sp_addrolemember 'db_owner' , 'cdc';