2012-06-02 3 views
0

Une base de données existante a déjà été déployée sur plusieurs clients.SQL Server: Transfert (en partie) de lignes de tables PK-FK (int) vers la base de données dans l'état inconnu

Maintenant, j'ai développé un ajout et j'ai besoin de transférer mes nouvelles rangées de tables PK-FK aux différents db cibles. Mais je ne peux pas simplement copier les PK car la cible pourrait déjà utiliser ce PK spécifique et donc être dans un état inconnu lors de l'écriture du script de mise à jour ...

Toutes les idées sauf l'augmentation des nombres PK sur la source db par, disons dix mille, en espérant qu'il sera assez élevé pour ne pas interférer avec les PK cibles?

Merci

+1

Cette question pourrait vous donner des idées sur ce que vous pouvez faire. [Utilisation de merge..output pour obtenir le mappage entre source.id et target.id] (http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping-between-source-id-and -target-id) –

+0

Merci Mikael, votre façon de "sortie" m'a fait penser à la relation info déjà là et comment la conserver en transférant les lignes ... voir ci-dessous. – Elementenfresser

Répondre

0

Je terminerai probablement

  • ajoutant GUIDs aux tables parallèles à mes int et PKs FKs.
  • Remplissage de ces champs avec newid() et copie de ces valeurs dans les tables FK.
  • Puis transférer mes lignes nouvellement ajoutées sans les données FK (après avoir désactivé les contraintes de vérification)
  • puis de rectifier les valeurs FK int en utilisant mes références GUID.

ça alors ce script va prendre un peu de temps ...

Mise à jour: Merci au commentaire de Mikael je trouve juste la solution devant mes yeux:

  • Je vais juste ajouter un nouvelle colonne "PK shadow", par défaut à la valeur PK.
  • puis retirez la valeur par défaut (de sorte que le db cible a des valeurs nulles là quand l'extension du schéma cible)
  • Ainsi, après le transfert des lignes (sans d'insertion d'identité sur) je vais encore avoir des références à l'ancienne PK
  • et ne doivent mettre à jour tous les « brisés » reliant les tables FKs FK avec la colonne d'ombre PK

et voici les scripts: http://www.morrenth.com/transferring-some-rows-having-.aspx

0

Vous pouvez utiliser des variables dans votre script contenant la scope_identity() pour chaque ligne PK et en utilisant cette valeur dans votre table FK.

Questions connexes