2009-02-11 7 views
1

J'ai besoin d'un outil ou d'une méthode qui permette le transfert de données et met à jour automatiquement les clés étrangères à la table de destination.Copie de données et maintien de l'intégrité référentielle pour les nouveaux ID

Le SET IDENTITY_INSERT ON/OFF n'est pas ce que je recherche.

Exemple:

table master (id int identity, name char) 
table slave (id int identity, master_id int, name char) 

Je voudrais créer un script comme celui-ci:

insert into master(name) values ('master a') 
insert into master(name) values ('master b') 

insert into slave(master_id,name) values (?, 'slave aa') 
insert into slave(master_id,name) values (?, 'slave bb') 
insert into slave(master_id,name) values (?, 'slave cc') 
insert into slave(master_id,name) values (?, 'slave dd') 

Lors de l'insertion des esclaves, je voudrais savoir quelle est la nouvelle valeur de la master_id , afin de garder la même relation que dans le tableau d'origine.

+0

Il semble que vous avez simplement deux tables dans une seule base de données. Mais les noms "maître" et "esclave" sont traditionnellement utilisés lorsque vous copiez des données d'une base de données à une autre, comme dans la réplication. Pouvez-vous clarifier? –

+0

Ce n'est pas une réplication. Les tables d'exemples pourraient être nommées "Auteur" et "Livre", par exemple. – pvieira

+0

as-tu essayé mon sproc? Cela devrait faire exactement ce que vous voulez. –

Répondre

2

@John Sansom: à droite sur l'argent

@ pv2008:

create proc InsertAndUpdate 
@parentName varchar(255), 
@childName varchar(255) 

as 
declare @newParentId int 
insert into PARENT values (@parentName) 
select @newParentId = SCOPE_IDENTITY() 

insert into CHILD values (@newParentId, @childName) 

appellent cela sproc chaque fois que vous insérez

4

Si vous utilisez des colonnes Identity dans vos tables, la fonction SCOPE_IDENTITY() renvoie l'ID du dernier enregistrement inséré. Vous pouvez ensuite l'utiliser comme clé étrangère pour la table secondaire.

http://msdn.microsoft.com/en-us/library/ms190315.aspx

sens?

Cheers, John

1

Si vous utilisez UniqueIdentifier (Guid) au lieu de int, vous n'avez pas besoin de changer les valeurs d'identité lorsque vous les déplacez d'une base de données à l'autre.

+0

Merci, mais ce sont des données héritées - Je ne peux pas changer le schéma. – pvieira