7

J'ai une base de données exécutée sous Sql Server 2005 avec une réplication de fusion. Je veux que certaines des colonnes FK soient 'non nulles' car elles devraient toujours avoir une valeur. SQL Server ne me laisse pas le faire bien, voici ce qu'il dit:Modification de la contrainte de colonne null/not null = erreur de réplication rowguid

  • Impossible de modifier la table. Il est incorrect de supprimer la contrainte par défaut sur la colonne rowguid utilisée par la réplication de fusion . La modification de schéma a échoué lors de l'exécution d'une procédure de réplication interne . Pour l'action corrective , consultez les autres messages d'erreur qui accompagnent ce message d'erreur. La transaction s'est terminée dans le déclencheur. Le lot a été annulé.

Je ne cherche pas à modifier les contraintes sur la colonne rowguid du tout, seulement sur une autre colonne qui agit en tant que FK. Les autres colonnes que je veux définir ne sont pas nulles car l'enregistrement n'a aucun sens sans cette information (c'est-à-dire sur un client, le nom du client).

Questions: Existe-t-il un moyen de mettre à jour les colonnes pour qu'elles soient 'non nulles' sans désactiver la réplication, puis la réactiver? Est-ce encore la meilleure façon de faire cela - devrais-je utiliser une contrainte à la place?

Répondre

8

Apparemment, SSMS apporte des modifications aux tables en les supprimant et en les recréant. Il suffit donc de faire les changements en utilisant l'instruction T-SQL.

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
3

Vous devez scripter votre changement dans les instructions T-SQL que SQL Server Management Studio cherchera à déposer et recréer la table, au lieu d'ajouter simplement la colonne supplémentaire.

Vous devrez également ajouter la nouvelle colonne à vos publications.

Veuillez noter que modifier une colonne de cette manière peut nuire aux performances de la réplication. En fonction de la taille de la table que vous modifiez, de nombreuses données peuvent être répliquées. Considérez que bien que votre modification de table puisse être effectuée dans une seule instruction, si 1 million de lignes sont affectées, 1 million de mises à jour seront générées sur l'Abonné, PAS une seule instruction de mise à jour comme on le pense généralement.

Les mains sur approche améliorée de la performance .......

Pour effectuer cet exercice, vous devez:

  1. sauvegarde de votre environnement de réplication par script votre configuration entière.
  2. Retirez la table de réplication à les éditeurs/abonnés
  3. Ajouter la colonne à chaque Éditeur/Abonné.
  4. Appliquez la mise à jour localement à chaque Publisher/Subscriber.
  5. Ajoutez la table à la réplication.
  6. Validez que les transactions sont répliquées.