J'ai remarqué que lorsque vous configurez une réplication transactionnelle, SQL Server définit la gestion des plages d'identité sur manuelle. Cela signifie que dans ma base de données d'abonnement, lorsque j'essaie d'insérer un nouvel enregistrement dans une table dont le PK est une colonne d'identité, cela me donne une erreur et me dit qu'il a essayé d'insérer un PK de "1", "2 "," 3 ", etc. Cela est dû au fait que la valeur d'identité actuelle pour toutes les colonnes d'identité sur l'abonné est réinitialisée à la valeur de départ (généralement 1) au lieu de rester à ce qu'elle était sur l'éditeur.
Je comprends pourquoi SQL Server fait cela - vous êtes censé laisser la table des abonnés en lecture seule. Cependant, mon scénario est un peu peu orthodoxe - je mets à jour mon abonné de temps en temps par le biais de la réplication, je fais une sauvegarde immédiate de cette base de données, puis je veux faire quelques mises à jour à l'abonné qui NE SERONT PAS repoussées vers l'éditeur, puis lorsque je vais mettre à jour l'abonné à nouveau, je restaure sa base de données à partir de la sauvegarde précédente et tire les dernières mises à jour. Parce que je veux faire des mises à jour pour l'abonné entre ces mises à jour («deltas temporaires» si vous voulez), j'ai besoin de la colonne d'identité pour fonctionner et ne pas réinitialiser à 1 lors de la réplication.
J'ai essayé d'activer la gestion automatique des plages d'identité lors de la configuration de ma publication, mais cela me donne simplement l'erreur suivante lorsque j'essaie d'ajouter un tableau à la publication:
Msg 21231, niveau 16, état 1, procédure sp_MSrepl_addarticle, ligne 2243
La prise en charge de la plage d'identité automatique n'est utile que pour les publications qui permettent la mise à jour des abonnés.
Existe-t-il un moyen de contourner ce problème? Je souhaite présenter cette réplication à SQL Server comme si elle était en lecture seule du côté abonné, car je ne prévois pas de faire des mises à jour qui seront repoussées vers l'éditeur , mais je veux faire des mises à jour temporaires qui sera effacé avant la prochaine réplication.
J'ai également considéré que la réplication de snapshot pourrait être une méthode plus appropriée que la réplication transactionnelle pour mon modèle d'utilisation, mais le problème est que la réplication de snapshot nécessite d'envoyer la base de données entière à chaque mise à jour; parce que je prévois de faire une sauvegarde immédiate de la base de données après la dernière réplication, je ne devrais pas avoir besoin de faire tout le transfert à chaque fois; juste les changements depuis la dernière fois.
Is there any way I can get round this problem?
Vous devez définir la colonne d'identité sur NOT FOR REPLICATION à l' aide de sys.sp_identitycolumnforreplication pour SQL Server 2005 et versions ultérieures. Vous n'avez même pas besoin de resnapshot vos articles lorsque vous modifiez la colonne d'identité comme non pour la réplication. Il suffit de ne pas le faire en utilisant l'interface graphique.