Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 07h04   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 8
Points : 8
Par défaut copie inter bd avec changement de foreign keys

Bonjour à tous,

J'aimerais savoir si quelqu'un a une solution pour ce problème fort probablement simple pour les experts. Dans mon cas, je sèche...

Voici, je dois faire une copie partielle (quelques colonnes, plusieurs lignes) de plusieurs tables d'une bd à une autre table d'une autre bd.

Le problème est le suivant, dans certains cas, j'ai une table avec des clefs référencés d'une autre table. Après la copie, les clefs référencés ne sont plus valide car l'identifiant de la table de référence n'est plus le même après la copie.

ex: bd1.TableA copie de colonne (Nom,Truc) dans bd2.TableA
bd1.TableB copie de colonne (IDLigneTableA,Machin) dans bd2.TableB

Dans la bd2.TAbleB, la colonne IDLigneTableA n'est plus valide car celui-ci à changé lors de la copie de la tableA.

Il faudrait donc altérer la ligne IDLigneTAbleA en fonction du changement de clef primaire entre bd1.TableA et bd2.TAbleA. Donc, pour une ligne, c'est simple:

alter table bd2.TableB(IDLigneTableA) values (bd2.TableA.IDligne1) where IDLigneTableA = bd1.TableA.IDligne1

mais comment faire pour l'ensemble des lignes des tablesA (10000)?

Merci à l'avance.
tremblou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 08h52   #2
Membre à l'essai
 
Homme Fabrice Flores
Administrateur de base de données
Inscription : décembre 2011
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Flores
Âge : 46
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Bâtiment

Informations forums :
Inscription : décembre 2011
Messages : 17
Points : 20
Points : 20
Par défaut Bonjour Tremblou

Pourquoi ne conserves-tu pas les clés existantes?
Tu peux insérer tes propres valeurs dans un champ identity en passant l'instruction suivante en début de code:

SET IDENTITY_INSERT TableA ON

puis celle-ci en fin de code:

SET IDENTITY_INSERT TableA OFF



Si tu tiens absolument à générer de nouvelles clés, j'aurais fait la chose suivante:

J'aurais copié mes tables de la Bd1 à la Bd2 en faisant la chose suivante:
Pour chaque table comportant des clés étrangères, par exemple la table B avec la clé étrangère IdTableA, j'aurais ajouté un champ IdTableA_Old.
J'aurais laissé le champ IdTableA vide et conservé les anciennes valeurs de clé dans IdTableA_Old.
Pour les tables dont l'ID est référencé dans des clés étrangères, j'aurais fait la même chose avec le champ ID. Exemple: IdA et IdA_Old

Ensuite j'aurais mis à jour ma table B en faisant:

Update TableB
Set IdTableA=(Select IdA From TableA where TableA.IdA_Old=TableB.IdTableA_Old)

Puis j'aurais terminé en supprimant mes champs _Old


J'espère avoir été clair dans mes explications...
fflores est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h26   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
Citation:
Le problème est le suivant, dans certains cas, j'ai une table avec des clefs référencés d'une autre table. Après la copie, les clefs référencés ne sont plus valide car l'identifiant de la table de référence n'est plus le même après la copie.
Pourquoi l'identifiant change-t-il ? Est ce que ce changement peut se faire plusieurs fois ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 17h45   #4
Invité régulier
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 8
Points : 8
Par défaut solved!

Super,

Tes explications sont limpides comme de l'eau de roche fflores. Je pense qu'avec ta solution #2, tout va fonctionner.
Je ne peux pas utiliser la #1 (INSERT_IDENTITY) p.c.que je ne suis pas certains que la valeur insérée entrera en conflit avec d'autres éléments. Grooooos merci, tu m'évite au moins 10000 opération ''répétitive et répétitante'' .

Citation:
Pourquoi l'identifiant change-t-il ? Est ce que ce changement peut se faire plusieurs fois ?
p.c.que lors de la copie des colonnes dans la bd2, de nouvelles lignes sont crées et un nouveau identifiant unique est généré pour chaque lignes crée. Celui-ci est différent de la table d'origine (bd1).
tremblou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h03.


 
 
 
 
Partenaires

Hébergement Web