Abonnements pouvant être mis à jour pour la réplication transactionnelleUpdatable Subscriptions - For Transactional Replication

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Notes

Cette fonctionnalité reste prise en charge dans les versions de SQL ServerSQL Server (2012 à 2016).This feature remains supported in versions of SQL ServerSQL Server from 2012 through 2016. Cette fonctionnalité est en mode de maintenance et risque d’être supprimée dans une prochaine version de Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

La réplication transactionnelle prend en charge les mises à jour sur les Abonnés par l'intermédiaire d'abonnements qu'il est possible de mettre à jour et la réplication d'égal à égal.Transactional replication supports updates at Subscribers through updatable subscriptions and peer-to-peer replication. Les deux types d’abonnements pouvant être mis à jour sont les suivants :The following are the two types of updatable subscriptions:

  • Mise à jour immédiate.Immediate updating. Le serveur de publication et l'Abonné doivent être connectés pour mettre à jour les données sur l'abonné.The Publisher and Subscriber must be connected to update data at the Subscriber.

  • Mise à jour en attente. Le serveur de publication et l'abonné ne doivent pas être connectés pour mettre à jour les données sur l'abonné.Queued updating The Publisher and Subscriber do not have to be connected to update data at the Subscriber. Les mises à jour peuvent être effectuées lorsque l'abonné ou le serveur de publication est hors connexion.Updates can be made while the Subscriber or Publisher is offline.

Lorsque les données sont mises à jour sur l'abonné, elles sont d'abord propagées au serveur de publication et ensuite aux autres abonnés.When data is updated at a Subscriber, it is first propagated to the Publisher and then propagated to other Subscribers. Dans le cas de la mise à jour immédiate, les modifications sont propagées immédiatement à l'aide du protocole de validation en deux phases.If immediate updating is used, the changes are propagated immediately using the two-phase commit protocol. Pour la mise à jour en attente, les modifications sont stockées dans une file d'attente et les transactions mises en file d'attente sont appliquées de façon asynchrone au niveau du serveur de publication chaque fois que la connectivité réseau est disponible.If queued updating is used, the changes are stored in a queue; the queued transactions are then applied asynchronously at the Publisher whenever network connectivity is available. Dans la mesure où les mises à jour sont propagées de façon asynchrone sur le serveur de publication, il peut arriver que les mêmes données soient mises à jour par le serveur de publication ou par un autre abonné, et des conflits peuvent naître lors de l'application des mises à jour.Because the updates are propagated asynchronously to the Publisher, the same data may have been updated by the Publisher or by another Subscriber and conflicts can occur when applying the updates. Les conflits sont détectés et résolus selon une stratégie de résolution de conflits définie lors de la création de la publication.Conflicts are detected and resolved according to a conflict resolution policy that is set when creating the publication.

Si vous créez une publication transactionnelle avec des abonnements qui peuvent être mis à jour dans l'Assistant Nouvel abonnement, les deux modes de mise à jour, immédiate et en attente, sont activés.If you create a transactional publication with updatable subscriptions in the New Publication Wizard, both immediate updating and queued updating are enabled. Si vous créez une publication avec des procédures stockées, vous pouvez n'en activer qu'un seul ou les deux.If you create a publication with stored procedures, you can enable one or both options. Lorsque vous créez un abonnement à la publication, vous spécifiez le mode de mise à jour à utiliser.When you create a subscription to the publication, you specify which update mode to use. Vous pouvez ensuite basculer entre les modes de mise à jour, le cas échéant.You can then switch between update modes if necessary. Pour plus d'informations, consultez la section « Basculement d'un mode de mise à jour à un autre ».For more information, see the following section "Switching between Update Modes".

Pour activer les abonnements pouvant être mis à jour pour les publications transactionnelles, consultez Enable Updating Subscriptions for Transactional Publications.To enable updatable subscriptions for transactional publications, Enable Updating Subscriptions for Transactional Publications

Pour créer des abonnements pouvant être mis à jour pour les publications transactionnelles, consultez Créer un abonnement pouvant être mis à jour pour une publication transactionnelle (Management Studio).To create updatable subscriptions for transactional publications, see Create an Updatable Subscription to a Transactional Publication (Management Studio)

Basculement d'un mode de mise à jour à l'autreSwitching Between Update Modes

Lorsque vous utilisez les abonnements pouvant être mis à jour, vous pouvez spécifier qu'un abonnement doit utiliser un mode de mise à jour puis basculer vers l'autre si l'application l'exige.When using updatable subscriptions you can specify that a subscription should use one update mode and then switch to the other if the application requires it. Vous pouvez, par exemple, spécifier qu'un abonnement doit utiliser la mise à jour immédiate mais basculer vers la mise à jour en attente si un échec système entraîne une perte de la connectivité réseau.For example, you can specify that a subscription should use immediate updating, but switch to queued updating if a system failure results in the loss of network connectivity.

Notes

La réplication ne bascule pas automatiquement d'un mode de mise à jour à l'autre.Replication does not switch automatically between update modes. Vous devez le configurer par le biais de SQL Server Management Studio ou votre application doit appeler sp_setreplfailovermode (Transact-SQL) pour basculer entre les modes.You must set the update mode through SQL Server Management Studio or your application must call sp_setreplfailovermode (Transact-SQL) to switch between modes.

Si vous basculez de la mise à jour immédiate à la mise à jour en attente, vous ne pouvez pas repasser à la mise à jour immédiate avant que l'abonné et le serveur de publication soient connectés et que l'Agent de lecture de la file d'attente ait appliqué tous les messages en attente dans la file d'attente sur le serveur de publication.If you switch from immediate updating to queued updating, you cannot switch back to immediate updating until the Subscriber and Publisher are connected and the Queue Reader Agent has applied all pending messages in the queue to the Publisher.

Pour basculer d'un mode de mise à jour vers un autreTo switch between update modes

Pour basculer d'un mode à l'autre, vous devez activer la publication et l'abonnement pour les deux modes de mise à jour puis basculer d'un mode à l'autre, le cas échéant.To switch between updating modes, you must enable the publication and subscription for both update modes, and then switch between them if necessary. Pour plus d'informations, consultezFor more information, see
Switch Between Update Modes for an Updatable Transactional Subscription.Switch Between Update Modes for an Updatable Transactional Subscription.

Considérations sur l'utilisation des abonnements pouvant être mis à jourConsiderations for Using Updatable Subscriptions

  • Après qu'une publication est activée pour les abonnements mis à jour immédiatement ou en attente, l'option ne peut plus être désactivée pour la publication (même si les abonnements ne doivent pas nécessairement l'utiliser).After a publication is enabled for updating subscriptions or queued updating subscriptions, the option cannot be disabled for the publication (although subscriptions do not need to use it). Pour désactiver cette option, vous devez supprimer la publication puis en recréer une nouvelle.To disable the option, the publication must be deleted and a new one created.

  • Il est impossible de republier des données.Republishing data is not supported.

  • La réplication ajoute la colonne msrepl_tran_version aux tables publiées à des fins de suivi.Replication adds the msrepl_tran_version column to published tables for tracking purposes. Du fait de cette colonne supplémentaire, toutes les instructions INSERT doivent inclure une liste de colonnes.Because of this additional column, all INSERT statements should include a column list.

  • Pour modifier le schéma dans une table d'une publication qui prend en charge les abonnements mis à jour, toutes les activités relatives à la table doivent être interrompues au niveau du serveur de publication et des abonnés et les modifications de données en attente doivent être propagées à tous les nœuds avant d'effectuer toute modification du schéma.To make schema changes on a table in a publication that supports updating subscriptions, all activity on the table must be stopped at the Publisher and Subscribers, and pending data changes must be propagated to all nodes before making any schema changes. De cette façon, vous êtes assuré que les transactions en cours n'entrent pas en conflit avec la modification de schéma en attente.This ensures that outstanding transactions do not conflict with the pending schema change. Après la propagation des modifications de schéma à tous les nœuds, l'activité peut reprendre dans les tables publiées.After the schema changes have propagated to all nodes, activity can resume on the published tables. Pour plus d’informations, consultez Suspendre une topologie de réplication (programmation Transact-SQL de la réplication).For more information, see Quiesce a Replication Topology (Replication Transact-SQL Programming).

  • Si vous prévoyez de basculer entre les modes de mise à jour, l'Agent de lecture de la file d'attente doit s'exécuter au moins une fois après l'initialisation de l'abonnement (par défaut, cet Agent s'exécute en continu).If you plan to switch between update modes, the Queue Reader Agent must run at least once after the subscription has been initialized (by default, the Queue Reader Agent runs continuously).

  • Si la base de données de l'abonné est partitionnée horizontalement et que certaines lignes de la partition existent chez l'abonné, mais pas sur le serveur de publication, l'abonné ne pourra pas mettre à jour les lignes préexistantes.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber, but not at the Publisher, the Subscriber cannot update the preexisting rows. Toute tentative de mise à jour de ces lignes renvoie un message d'erreur.Attempting to update these rows returns an error. Les lignes doivent être supprimées de la table puis ajoutées sur le serveur de publication.The rows should be deleted from the table and then added at the Publisher.

  • Les performances de la réplication transactionnelle avec des abonnés pouvant être mis à jour en file d’attente peuvent être lentes quand des index filtrés uniques sont utilisés.Transactional replication with Queued updateable subscribers could experience slow performance when unique filtered indexes are used. Si un conflit se produit sur un article qui a des index filtrés uniques, la résolution des conflits conduirait à d’autres suppressions et insertions sur l’abonné pour les lignes non couvertes par l’index filtré unique.If a conflict occurs on an article that has unique filtered indexes then conflict resolution would lead to additional deletes and inserts on the subscriber for the rows that are not covered by the unique filtered index.

Mises à jour sur l'abonnéUpdates at the Subscriber

  • Les mises à jour sur l'abonné sont propagées au serveur de publication même si un abonnement expire ou est inactif.Updates at the Subscriber are propagated to the Publisher even if a subscription is expired or is inactive. Vérifiez que ces abonnements sont effectivement supprimés ou réinitialisés.Ensure that any such subscriptions are either dropped or reinitialized.

  • Si des colonnes TIMESTAMP ou IDENTITY sont utilisées et répliquées en tant que types de données de base, les valeurs qu’elles contiennent ne doivent pas être mises à jour sur l’Abonné.If TIMESTAMP or IDENTITY columns are used, and they are replicated as their base data types, values in these columns should not be updated at the Subscriber.

  • Les Abonnés ne peuvent pas mettre à jour ou insérer des valeurs text, ntext ou image , car il est impossible de lire à partir des tables insérées ou supprimées dans les déclencheurs de suivi des modifications de réplication.Subscribers cannot update or insert text, ntext or image values because it is not possible to read from the inserted or deleted tables inside the replication change-tracking triggers. De même, les Abonnés ne peuvent pas mettre à jour ou insérer de valeur text ou image à l’aide de WRITETEXT ou UPDATETEXT , car les données sont écrasées par le serveur de publication.Similarly, Subscribers cannot update or insert text or image values using WRITETEXT or UPDATETEXT because the data is overwritten by the Publisher. En revanche, vous pouvez partitionner les colonnes text et image dans une table distincte et modifier les deux tables à l’intérieur d’une transaction.Instead, you could partition the text and image columns into a separate table and modify the two tables within a transaction.

    Pour mettre à jour des objets volumineux sur un Abonné, utilisez respectivement les types de données varchar(max) , nvarchar(max) et varbinary(max) au lieu des types de données text, ntextet image .To update large objects at a Subscriber, use the data types varchar(max), nvarchar(max), varbinary(max) instead of text, ntext, and image data types, respectively.

  • Les mises à jour de clés uniques (y compris les clés primaires) générant des doublons (comme une mise à jour de type UPDATE <column> SET <column> =<column>+1 ) ne sont pas autorisées et sont rejetées en raison d’une violation d’unicité.Updates to unique keys (including primary keys) that generate duplicates (for example, an update of the form UPDATE <column> SET <column> =<column>+1 are not allowed and will be rejected because of a uniqueness violation. En effet, les mises à jour de jeux appliquées sur l’Abonné sont propagées par la réplication en tant qu’instructions UPDATE individuelles pour chaque ligne concernée.This is because set updates made at the Subscriber are propagated by replication as individual UPDATE statements for each row affected.

  • Si la base de données de l'abonné est partitionnée horizontalement et que des lignes de la partition existent sur l'abonné mais non sur le serveur de publication, l'abonné ne peut pas mettre à jour les lignes pré-existantes.If the Subscriber database is partitioned horizontally and there are rows in the partition that exist at the Subscriber but not at the Publisher, the Subscriber cannot update the pre-existing rows. Toute tentative de mise à jour de ces lignes renvoie un message d'erreur.Attempting to update these rows returns an error. Les lignes doivent être supprimées de la table puis réinsérées.The rows should be deleted from the table and inserted again.

Déclencheurs définis par l’utilisateurUser-defined Triggers

  • Si l’application exige la présence de déclencheurs sur l’Abonné, ceux-ci doivent être définis avec l’option NOT FOR REPLICATION sur le serveur de publication et l’Abonné.If the application requires triggers at the Subscriber, the triggers should be defined with the NOT FOR REPLICATION option at the Publisher and Subscriber. Cela garantit l'activation des déclencheurs pour la modification de données d'origine uniquement mais pas lors de la réplication de cette modification.This ensures that triggers fire only for the original data change, but not when that change is replicated.

    Veillez à ce que le déclencheur défini par l'utilisateur ne s'active pas lorsque le déclencheur de réplication met à jour la table.Ensure that the user-defined trigger does not fire when the replication trigger updates the table. Pour ce faire, la procédure sp_check_for_sync_trigger doit être appelée dans le corps du déclencheur défini par l’utilisateur.This is accomplished by calling the procedure sp_check_for_sync_trigger in the body of the user-defined trigger. Pour plus d’informations, consultez sp_check_for_sync_trigger (Transact-SQL).For more information, see sp_check_for_sync_trigger (Transact-SQL).

Mise à jour immédiateImmediate Updating

  • Pour des abonnements mis à jour immédiatement, les modifications sur l'abonné sont propagées au serveur de publication et appliquées à l'aide du Coordinateur de transactions distribuées Microsoft (MSDTC, Microsoft Distributed Transaction Coordinator).For immediate updating subscriptions, changes at the Subscriber are propagated to the Publisher and applied using Microsoft Distributed Transaction Coordinator (MS DTC). Vérifiez que ce dernier est installé et configuré sur le serveur de publication et l'abonné.Ensure that MS DTC is installed and configured at the Publisher and Subscriber. Pour plus d'informations, consultez la documentation Windows.For more information, see the Windows documentation.

  • Les déclencheurs utilisés par les abonnements mis à jour immédiatement exigent une connexion au serveur de publication pour répliquer les modifications.The triggers used by immediate updating subscriptions require a connection to the Publisher to replicate changes.

  • Si la publication autorise les abonnements mis à jour immédiatement et qu'un article de la publication possède un filtre de colonne, vous ne pouvez pas retirer les colonnes n'acceptant pas les valeurs NULL sans valeurs par défaut.If the publication allows immediate updating subscriptions and an article in the publication has a column filter, you cannot filter out non-nullable columns without defaults.

Mise à jour en attenteQueued Updating

  • Les tables contenues dans une publication de fusion ne peuvent pas être publiées en même temps dans le cadre d'une réplication transactionnelle qui autorise les abonnements mis à jour en attente.Tables included in a merge publication cannot also be published as part of a transactional publication that allows queued updating subscriptions.

  • Lorsque la mise à jour en attente est utilisée, il est déconseillé d'effectuer des mises à jour sur les colonnes clés primaire car la clé primaire sert de localisateur d'enregistrement pour toutes les requêtes.Updates made to primary key columns are not recommended when using queued updating because the primary key is used as a record locator for all queries. Lorsque la stratégie de résolution de conflit prévoit que " l'abonné gagne ", les mises à jour de clés primaires doivent être effectuées avec précaution.When the conflict resolution policy is set to Subscriber Wins, updates to primary keys should be made with caution. Si des mises à jour de la clé primaire sont effectuées à la fois sur le serveur de publication et sur l'abonné, il en résultera deux lignes avec des clés primaires différentes.If updates to the primary key are made at both the Publisher and at the Subscriber, the result will be two rows with different primary keys.

  • Pour les colonnes de type de données SQL_VARIANT: quand des données sont insérées ou mises à jour sur l’abonné, elles sont mappées de la façon suivante par l’Agent de lecture de la file d’attente quand elles sont copiées de l’abonné vers la file d’attente :For columns of data type SQL_VARIANT: when data is inserted or updated at the Subscriber, it is mapped in the following way by the Queue Reader Agent when it is copied from the Subscriber to the queue:

    • BIGINT, DECIMAL, NUMERIC, MONEYet SMALLMONEY sont mappés à NUMERIC.BIGINT, DECIMAL, NUMERIC, MONEY, and SMALLMONEY are mapped to NUMERIC.

    • BINARY et VARBINARY sont mappés aux données VARBINARY .BINARY and VARBINARY are mapped to VARBINARY data.

Détection et résolution des conflitsConflict Detection and Resolution

  • Dans le cas d'une stratégie de conflit où l'abonné « gagne » : la résolution de conflit n'est pas prise en charge pour les mises à jour des colonnes de clé primaire.For the Subscriber Wins conflict policy: conflict resolution is not supported for updates to primary key columns.

  • Les conflits provoqués par des échecs de contraintes de clés étrangères ne sont pas résolus par la réplication :Conflicts due to foreign key constraint failures are not resolved by replication:

    • Si vous ne prévoyez pas de conflits et que les données sont bien partitionnées (les abonnés ne mettent pas à jour les mêmes lignes), vous pouvez utiliser les contraintes de clés étrangères sur le serveur de publication et les abonnés.If conflicts are not expected and data is well partitioned (Subscribers do not update the same rows), you can use foreign key constraints on the Publisher and Subscribers.

    • Si des confits sont prévisibles : vous ne devez pas utiliser des contraintes de clés étrangères sur le serveur de publication ou l'abonné si vous optez pour la résolution de conflit où l'abonné prime ; vous ne devez pas utiliser des contraintes de clés étrangères sur l'abonné si vous utilisez la résolution de conflit où le serveur de publication prime.If conflicts are expected: you should not use foreign key constraints at the Publisher or Subscriber if you use "Subscriber wins" conflict resolution; you should not use foreign key constraints at the Subscriber if you use "Publisher wins" conflict resolution.

Voir aussiSee Also

Peer-to-Peer Transactional Replication Peer-to-Peer Transactional Replication
Réplication transactionnelle Transactional Replication
Publier des données et des objets de base de données Publish Data and Database Objects
S'abonner à des publicationsSubscribe to Publications