web-dev-qa-db-fra.com

SQL Server - Copiez les données d'une base de données vers une autre - tables identiques, nouvelles valeurs d'identité nécessaires

Voici la chose, j'ai exécuté des copies identiques de mon site Web pour deux régions géographiques différentes. Le site prend désormais en charge la tarification multidevise, je souhaite donc fusionner les deux sites ensemble.

Toutes les tables que je dois fusionner sont basées sur l'identité et stupidement les tables correspondantes dans chaque copie de la base de données ont été prédéfinies au même nombre.

Existe-t-il un moyen de copier les données d'une base de données vers une autre en même temps en donnant aux données de copie de nouvelles valeurs d'identité qui se reflètent également dans les valeurs de clé étrangère des tables référencées?

c'est à dire.

Account
- Id
- Email
- FirstName
- etc

AccountImage
- Id
- Account_id
- FileName
- etc

Etc..

3
Jordan

À moins que je manque quelque chose, votre problème ne consiste pas à déplacer les données, il traite des valeurs d'identité déjà définies. Si tel est le cas, essayez ceci.

  1. Choisissez une valeur supérieure à vos valeurs d'identification actuelles sur l'une ou l'autre base de données. Je choisirais une valeur ronde, disons 1 000 000.
  2. Choisissez les valeurs d'identification que vous souhaitez modifier (par exemple, si vous avez des tables de recherche identiques pour les deux bases de données, vous souhaiterez probablement les laisser identiques).
  3. Lorsque vous déplacez vos données, ajoutez la valeur que vous avez sélectionnée à l'étape 1 à la valeur des identifiants que vous souhaitez modifier lorsque vous les déplacez.

Tant que vous êtes cohérent dans la valeur que vous ajoutez, toutes vos relations resteront les mêmes dans la base de données combinée. Donc par exemple

Vous avez une table des employés avec un identifiant max actuel de 200 000 dans la base de données A et 1 400 000 dans la base de données B. Vous décidez de déplacer les données de la base de données A vers la base de données B, car cela signifie déplacer moins de données. Lorsque vous déplacez votre table des employés, vous ajoutez 2 000 000 à la colonne Employee_Id.

USE DatabaseB
GO

SET IDENTITY_INSERT Employee ON

INSERT INTO Employee (Employee_Id, Other_Columns)
SELECT Employee_Id + 2000000, Other_Columns
FROM DatabaseA.dbo.Employee

SET IDENTITY_INSERT Employee OFF
GO

Et le dernier conseil sauvegardez tout avant de commencer au cas où vous feriez une erreur :)

7
Kenneth Fisher

SI les deux bases de données sont sur le même serveur et que vous êtes autorisé à accéder aux deux bases de données

Méthode 1:

Vous pouvez créer un script pour la base de données principale entière et l'exécuter avec un nouveau nom de base de données, puis vous aurez le même schéma et les mêmes données de la base de données principale (Possible à partir de la version SQL Server 2008).

Méthode 2:

Si vous n'avez besoin que de quelques tables avec schéma, relations et données, puis scriptez-le à partir de la base de données principale

Suivre la hiérarchie des tableaux - 1.Master table 2.Child table

  1. Schéma des tables de script
  2. Données de table de script
  3. Relations et contraintes de table de script

Exécutez-le dans le même ordre

Méthode 3:

Si vous n'avez besoin que de schémas de tables et de données, optez pour IMPORT/EXPORT

0
sairam

La façon la plus simple est peut-être de simplement faire une insertion ... sélectionner, re-référencer en même temps en utilisant set identity_insert on et en ajoutant une valeur fixe à l'identité existante pour éviter tout conflit entre les ensembles de données?

Quelque chose comme ça:

set identity_insert myTable on

insert into db1.dbo.myTable
( identity_column, [column, column...] )
select identity_column+1000, [column, column...]
from db2.dbo.myTable

set identity_insert myTable off
0
paulH