2010-11-11 10 views
0

Je tente de copier des données uniquement entre deux bases de données SQL Server 2008. Je dois conserver intactes les procs et les fonctions stockées existantes et copier uniquement les données. Les schémas DB sont identiques, mais je rencontre des problèmes avec PK.Copie de données uniquement entre deux bases de données

j'ai essayé:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
EXEC sp_MSForEachTable 'DELETE FROM ?' 

Pour supprimer toutes les données. Mais obtenir

Failure inserting into the read-only column 

Alors je puis essayé de mettre identity_insert sur toutes les tables avec:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
EXEC sp_MSForEachTable 'DELETE FROM ?' 
EXEC sp_MSForEachTable 'ALTER TABLE ? SET IDENTITY_INSERT ON' 

sans chance.

Quelle est la meilleure façon d'exporter des données uniquement entre deux bases de données, en laissant intacts les processus et les fonctions d'origine?

Merci.

Modifier: Im using SQL Export pour copier les données de la source à la destination. J'ai besoin de garder les procs DBs destinations et fonctions, il suffit de copier les données seulement.

+1

Il semble que vous n'avez pas besoin de conserver les données existantes dans le deuxième tableau, mais juste faire une copie exacte des données dans le premier. Est-ce exact? –

+0

Non, la base de données cible n'aura pas de données, mais j'ai besoin de garder les procs et les func intacts. Je vais effacer la base de données cible en utilisant le DELETE FROM? commande ci-dessus; il aura des données avant de commencer. Par conséquent, il s'agira d'une base de données vide contenant des données. – Jammin

Répondre

1

Je l'aborderais probablement sous un angle différent: en scriptant tous les objets via SQL Enterprise Manager dans un fichier et en exécutant ce fichier sur une base de données vierge. De cette façon, vous aurez toutes les métadonnées mais pas de données réelles dans la deuxième base de données, et vous pourrez l'utiliser pour d'autres copies dans le futur.

2

Supprimez simplement la spécification d'identité de tous les clés de table dans la seconde base de données. Ce qui se passe probablement ici est que vous avez pkey comme colonne d'identité dans les deux dbs, et il est logique de le faire dans le premier, mais vous ne pouvez pas copier sa valeur dans une autre colonne d'identité.

Vous ne voudriez pas que pkey soit une clé d'identité dans la seconde base de données, alors, toutes vos clés étrangères ne fonctionneraient pas.

+0

Existe-t-il une manière globale de faire cela que je peux facilement revenir après? Merci – Jammin

1

L'erreur que vous obtenez ne semble pas être une violation PK ou un problème d'identité. Je vois deux causes possibles:

  1. Si vous obtenez l'erreur lorsque vous essayez d'insérer les données, je vérifier si les tables ont une computed columns. De nombreux programmes ne parviennent pas à les prendre en compte lors de l'exportation des données et incluent les colonnes calculées dans la liste des colonnes d'insertion. Si vous obtenez cette erreur à l'étape de suppression, vous avez probablement un déclencheur qui se déclenche lors de la suppression, et il essaie d'insérer des données et échoue pour une raison quelconque (l'idée de ces déclencheurs est de conserver une copie de la suppression). données dans un autre endroit). Si tel est le cas, corrigez l'insertion ou désactivez simplement le déclencheur.

0

Je suis allé avec une varation des deux réponses à la fin. J'ai utilisé une 3ème base de données comme base de données temporaire.

1) J'ai fait une sauvegarde complète de la base de données dont j'avais besoin des données (en direct)
2) J'ai restauré cette sauvegarde dans ma base de données temporaire.
3) J'ai scripté la base de données dont j'avais besoin de la procs et des fonctions, seulement scripting procs et funcs et en utilisant DROP et IF INCLUDES.
4) J'ai exécuté le script de # 3 contre ma base de données temporaire donnant les données de DB1 et les procs et funcs de DB2
5) J'ai restauré DB2 en utilisant OVERWRITE à partir d'une sauvegarde de ma base de données temporaire.

Merci les gars id marquer tous comme si je pouvais.

+0

Pouvez-vous éditer votre réponse en définissant plus explicitement la correspondance entre les noms (DB1, DB2, DB3) et ("base de données temporaire", "live", base de données cible). Est-ce que "j'ai utilisé une 3ème base de données en tant que base de données temporaire" signifie que "base de données temporaire" est DB3? alors 4) n'est pas clair. DB2 est la base de données cible? Je ne pouvais pas comprendre pourquoi avez-vous besoin de "base de données temporaire" pour ces manupulations du tout !? –

Questions connexes