Suivre les modifications de données (SQL Server)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance

SQL Server fournit deux fonctionnalités qui suivent les modifications apportées aux données d'une base de données : capture des changements de données et Suivi des modifications. Ces fonctionnalités permettent aux applications de déterminer les modifications de DML (opérations d’insertion, de mise à jour et de suppression) apportées aux tables utilisateur dans une base de données. La capture de données modifiées et le suivi des modifications peuvent être activés sur la même base de données ; aucune attention particulière n'est requise. Pour connaître les éditions de SQL Server qui prennent en charge la capture des changements de données et le suivi des modifications, consultez Éditions et fonctionnalités de SQL Server 2022 prises en charge.

Avantages liés à l'utilisation de la capture des changements de données ou du suivi des modifications

Certaines applications doivent, pour être efficaces, être en mesure de rechercher les données qui ont été modifiées dans une base de données. En règle générale, les développeurs d'applications doivent, pour identifier les données modifiées, implémenter une méthode de suivi personnalisée dans leurs applications en utilisant une combinaison de déclencheurs, de colonnes d'horodateur et de tables supplémentaires. La création de ces applications demande généralement un effort considérable, aboutit à des mises à jour de schéma et se traduit souvent par une importante diminution des performances.

L'utilisation de la capture de données modifiées ou du suivi des modifications dans les applications pour suivre les modifications dans une base de données présente les avantages suivants par rapport au développement d'une solution personnalisée :

  • La durée de développement est réduite. SQL Server proposant cette fonctionnalité, vous n'avez pas à développer de solution personnalisée.

  • Les modifications de schémas ne sont requises. Vous n'avez pas à ajouter de colonnes ou de déclencheurs ni à créer une table latérale dans laquelle suivre les lignes supprimées ou stocker des informations de suivi des modifications si les colonnes ne peuvent pas être ajoutées aux tables utilisateur.

  • Il existe un mécanisme de nettoyage intégré. Le nettoyage du suivi des modifications s'effectue automatiquement en arrière-plan. Un nettoyage personnalisé pour des données stockées dans une table annexe n'est pas requis.

  • Des fonctions sont fournies pour l'obtention des informations de modification.

  • Faible charge de traitement des opérations DML. Le suivi synchrone des modifications entraîne toujours une charge de traitement. Toutefois, le recours au suivi des modifications peut contribuer à réduire cette charge. La charge de traitement est souvent inférieure à celle qu’entraînent des solutions alternatives, en particulier lorsque celles-ci demandent d’utiliser des déclencheurs.

  • Le suivi des modifications est basé sur des transactions validées. L'ordre des modifications est basé sur l'heure de validation des transactions. Cela favorise l'obtention de résultats fiables lorsque sont impliquées des transactions longues ou qui se chevauchent. Les solutions personnalisées qui utilisent des valeurs timestamp doivent être conçues pour gérer ces scénarios.

  • Les outils standard sont disponibles pour les opérations de configuration et de gestion. SQL Server fournit des instructions DDL standard, SQL Server Management Studio, des affichages catalogue et des autorisations de sécurité.

Différences de fonctionnalités entre la capture des changements de données et le suivi des modifications

Le tableau suivant répertorie les différences de fonctionnalités entre la capture de données modifiées et le suivi des modifications. Le mécanisme de suivi de la capture de données modifiées implique une capture asynchrone des modifications à partir du journal des transactions afin que les modifications soient disponibles après l'opération DML. Dans le suivi des modifications, le mécanisme de suivi implique le suivi synchrone des modifications en parallèle avec les opérations DML, afin que les informations relatives aux modifications soient disponibles immédiatement.

Fonctionnalité Capture des données modifiées Suivi des modifications
Modifications suivies
Modifications DML Oui Oui
Informations suivies
Données historiques Oui Non
Si la colonne a été modifiée Oui Oui
Type DML Oui Oui

Capture des données modifiées

La capture de données modifiées fournit des informations de modification historiques pour une table utilisateur en capturant à la fois le fait que des modifications DML aient été apportées et les données effectivement modifiées. Les modifications sont capturées à l'aide d'un processus asynchrone qui lit le journal des transactions et n'a qu'un faible impact sur le système.

Comme indiqué dans l'illustration suivante, les modifications apportées aux tables utilisateur sont capturées dans des tables de modifications correspondantes. Ces tables de modifications fournissent une vue historique des modifications au fil du temps. Les fonctions de capture des changements de données fournies par SQL Server permettent de consommer facilement et systématiquement les changements de données.

Diagramme montrant le concept de capture des changements de données.

Modèle de sécurité

Cette section décrit le modèle de sécurité de la capture de données modifiées.

Configuration et administration

Pour activer ou désactiver la capture des changements de données pour une base de données, l’appelant de sys.sp_cdc_enable_db (Transact-SQL) ou sys.sp_cdc_disable_db (Transact-SQL) doit être membre du rôle serveur fixe sysadmin. Activer et désactiver la capture des changements de données au niveau de la table exigent que l’appelant de sys.sp_cdc_enable_table (Transact-SQL) et sys.sp_cdc_disable_table (Transact-SQL) soit membre du rôle sysadmin ou du rôle de base de données db_owner.

L’utilisation de procédures stockées pour prendre en charge l’administration des travaux de capture de données modifiées est limitée aux membres du rôle serveur sysadmin et du rôle de base de données db_owner .

Énumération des modifications et requêtes de métadonnées

Pour accéder aux données de modification associées à une instance de capture, l'utilisateur doit disposer d'un accès SELECT à toutes les colonnes capturées de la table source associée. De plus, si un rôle de régulation est spécifié lors de la création de l'instance de capture, l'appelant doit également être membre du rôle de régulation spécifié, et le schéma de capture des changements de données (cdc) doit avoir un accès SELECT au rôle de régulation.

Les autres fonctions générales de capture des changements de données pour accéder aux métadonnées seront accessibles à tous les utilisateurs de la base de données par le biais du rôle public, bien que l'accès aux métadonnées retournées soit généralement régulé par l'utilisation de l'accès SELECT aux tables sources sous-jacentes, et par l'appartenance à tout rôle de régulation défini.

Opérations DDL pour modifier les tables sources compatibles avec la capture des changements de données

Lorsqu’une table est activée pour la capture de données modifiées, des opérations DDL peuvent être appliquées à la table uniquement par un membre du rôle serveur fixe sysadmin, un membre du rôle de base de données db_ownerou un membre du rôle de base de données db_ddladmin. Les utilisateurs autorisés de manière explicite à effectuer des opérations DDL sur la table recevront l'erreur 22914 s'ils tentent d'effectuer ces opérations.

Considérations relatives aux types de données pour la capture des changements de données

Tous les types de colonne de base sont pris en charge par la capture de données modifiées. Le tableau suivant indique le comportement et les limites de plusieurs types de colonne.

Type de colonne Modifications capturées dans les tables de modifications Limites
Colonnes éparses Oui Ne prend pas en charge la capture des modifications lors de l'utilisation d'un jeu de colonnes.
Colonnes calculées Non Les modifications apportées aux colonnes calculées ne sont pas suivies. La colonne apparaît dans la table de modifications avec le type approprié, mais aura une valeur NULL.
XML Oui Les modifications apportées aux éléments XML individuels ne sont pas suivies.
Timestamp Oui Le type de données dans la table des modifications est converti en binaire.
types de données BLOB Oui L'image précédente de la colonne BLOB est stockée uniquement si la colonne elle-même est modifiée.

Intégration des fonctionnalités de SQL Server

Cette section décrit comment les fonctionnalités suivantes interagissent avec la capture de données modifiées :

  • Mise en miroir de bases de données
  • Réplication transactionnelle
  • Restauration ou attachement de base de données

Mise en miroir de bases de données

Une base de données prenant en charge la capture de données modifiées peut être mise en miroir. Pour faire en sorte que la capture et le nettoyage s'exécutent automatiquement sur le miroir, suivez ces étapes :

  1. Vérifiez que l'Agent SQL Server s'exécute sur le miroir.

  2. Créez le travail de capture et le travail de nettoyage sur le miroir le basculement de l'unité principale sur l'unité miroir. Pour créer les travaux, utilisez la procédure stockée sys.sp_cdc_add_job (Transact-SQL).

Pour plus d’informations sur la mise en miroir de bases de données, consultez Mise en miroir de bases de données (SQL Server).

Réplication transactionnelle

La capture de données modifiées et la réplication transactionnelle peuvent coexister dans la même base de données, mais le remplissage des tables de modifications est géré différemment lorsque les deux fonctionnalités sont activées. La capture des changements de données et la réplication transactionnelle utilisent toujours la même procédure, sp_replcmds, pour lire les modifications dans le journal des transactions. Quand la capture des changements de données est la seule fonctionnalité activée, un travail de SQL Server Agent appelle sp_replcmds. Quand les deux fonctionnalités sont activées sur la même base de données, l’Agent de lecture du journal appelle sp_replcmds. Cet agent remplit à la fois les tables de modifications et les tables de bases de données de distribution. Pour plus d’informations, consultez Replication Log Reader Agent.

Considérez un scénario dans lequel la capture de données modifiées est activée sur la base de données AdventureWorks2022 , et deux tables sont activées pour la capture. Pour remplir les tables de modifications, le travail de capture appelle sp_replcmds. La base de données est activée pour la réplication transactionnelle, et une publication est créée. Ensuite, l'Agent de lecture du journal est créé pour la base de données et le travail de capture est supprimé. L'Agent de lecture du journal continue à analyser le journal à partir du dernier numéro séquentiel dans le journal qui été validé dans la table de modifications. Cela garantit la cohérence des données dans les tables de modifications. Si la réplication transactionnelle est désactivée dans cette base de données, l'Agent de lecture du journal est supprimé, et le travail de capture est recréé.

Remarque

Lorsque l'Agent de lecture du journal est utilisé à la fois pour la capture des changements de données et la réplication transactionnelle, les modifications répliquées sont écrites en premier dans la base de données de distribution. Puis, les modifications capturées sont écrites dans les tables de modifications. Les deux opérations sont validées ensemble. Si l'écriture dans la base de données de distribution s'effectue avec une latence, la même latence est observée avant l'affichage des modifications dans les tables de modifications.

Rétablir ou attacher une base de données activée pour la capture des changements de données

SQL Server utilise la logique suivante pour déterminer si la capture des changements de données reste activée après qu'une base de données a été restaurée ou attachée :

  • Si une base de données est restaurée sur le même serveur avec le même nom de base de données, la capture des changements de données reste activée.

  • Si une base de données est restaurée sur un autre serveur, par défaut, la capture des changements de données est désactivée, et toutes les métadonnées connexes sont supprimées.

    Pour conserver la fonction de capture de données modifiées, utilisez l'option KEEP_CDC lors de la restauration de la base de données. Pour plus d'informations sur cette option, consultez RESTORE.

  • Si une base de données est détachée puis attachée au même serveur ou à un autre serveur, la capture de données modifiées reste activée.

  • Si une base de données est attachée ou restaurée avec l’option KEEP_CDC à toute édition autre que Standard ou Enterprise, l’opération est bloquée, car la capture des changements de données requiert SQL Server Standard ou Enterprise. Le message d'erreur 932 est affiché :

    SQL Server cannot load database '%.*ls' because change data capture is enabled. The currently installed edition of SQL Server does not support change data capture. Either disable change data capture in the database by using a supported edition of SQL Server, or upgrade the instance to one that supports change data capture.
    

Vous pouvez utiliser sys.sp_cdc_disable_db pour supprimer la capture de données modifiées d’une base de données restaurée ou attachée.

Suivi des modifications

Le suivi des modifications capture le fait que des lignes d’une table ont été modifiées, mais ne capture pas les données modifiées. Cela permet aux applications de déterminer les lignes qui ont changé, les données de ligne les plus récentes étant obtenues directement à partir des tables utilisateur. Le suivi des modifications est par conséquent plus limité dans les questions historiques auxquelles il peut répondre, comparé à la capture de données modifiées. Toutefois, pour les applications qui ne requièrent pas d'informations historiques, la charge de stockage est largement inférieure puisque les données modifiées ne sont pas capturées. Un mécanisme de suivi synchrone est utilisé pour assurer le suivi des modifications. Ce mécanisme a été conçu pour imposer une charge minimale sur les opérations DML.

L'illustration suivante montre un scénario de synchronisation qui pourrait tirer parti du suivi des modifications. Dans ce scénario, une application requiert les informations suivantes : toutes les lignes de la table qui ont été modifiées depuis la dernière synchronisation de la table et uniquement les données de la ligne actuelle. Étant donné qu'un mécanisme synchrone est utilisé pour assurer le suivi des modifications, une application peut effectuer la synchronisation bidirectionnelle et détecter de manière fiable tout conflit pouvant survenir.

Diagramme montrant le concept de suivi des modifications.

Suivi des modifications et Sync Services for ADO.NET

Sync Services pour ADO.NET permet la synchronisation entre des bases de données, ce qui fournit une API intuitive et flexible qui vous permet de générer des applications qui ciblent des scénarios hors connexion et collaboratifs. Sync Services pour ADO.NET fournit une API pour synchroniser les modifications, mais ne suit pas réellement des modifications du serveur ou de la base de données d'homologues. Vous pouvez créer un système de suivi des modifications personnalisé, mais cela entraîne généralement un coût élevé au niveau de la complexité et des performances. Pour effectuer le suivi des modifications sur un serveur ou dans une base de données d'homologues, nous recommandons d'utiliser le suivi des modifications dans SQL Server car il est facile à configurer et procure un excellent suivi des performances.

Pour plus d'informations sur le suivi des modifications et Sync Services pour ADO.NET, utilisez les liens suivants :