2009-05-29 4 views
5

J'ai une base de données en direct qui a supprimé certaines données et j'ai besoin de ces données. J'ai une copie très récente de cette base de données qui a déjà été restaurée sur une autre machine. Des modifications non liées ont été apportées à la base de données en ligne depuis la sauvegarde, donc je ne veux pas effacer la base de données en direct avec une restauration complète. Les données dont j'ai besoin sont petites - juste une douzaine de lignes - mais ces douzaines de lignes ont chacune deux rangées d'autres tables avec des clés étrangères, et ces deux lignes ont dieu sait combien de lignes avec des clés étrangères pointant vers elles , ce serait donc compliqué à restaurer à la main. Idéalement, je serais capable de dire à la copie de sauvegarde de la base de données de sélectionner la douzaine de lignes dont j'ai besoin, et la fermeture transitive de tout ce qui en dépend, et tout ce qui en dépend, et exporter juste ces données, que je peux ensuite importer dans la base de données en direct sans toucher quoi que ce soit d'autre.Comment puis-je récupérer une petite partie des données d'une sauvegarde de base de données SQL Server?

Quelle est la meilleure approche à prendre ici? Merci.

Tout le monde a mentionné sp_generate_inserts. En l'utilisant, comment empêchez-vous que les colonnes Identity ne gâchent tout? Activez-vous simplement IDENTITY INSERT?

+0

+1, bonne chance! –

Répondre

1

J'ai déjà rencontré des situations similaires, mais j'ai trouvé que le faire à la main fonctionnait le mieux pour moi.

J'ai restauré la sauvegarde sur un deuxième serveur et fait ma requête pour obtenir les informations dont j'avais besoin, puis je construis un script pour insérer les données sp_generate_inserts puis répété pour chacune de mes tables qui avaient des lignes relationnelles.

Au total, j'avais seulement environ 10 enregistrements de base avec des données relationnelles dans 2 autres tables. Il m'a seulement fallu environ une heure pour tout récupérer comme il était.

MISE À JOUR Pour répondre à votre question sur sp_generate_inserts, aussi longtemps que vous spécifiez @ propriétaire = « dbo », il établira l'insertion d'identité sur ON puis le mettre hors service à la fin du script pour vous.

+0

J'ai eu du succès. sp_generate_inserts est utile, mais il échoue (comme il le dit) sur les tables avec beaucoup de colonnes et de tables avec des colonnes nvarchar. Et, vous êtes limité à 128 caractères pour votre clause WHERE. En conséquence, je devais faire au moins une chose manuellement pour chaque table. –

1

vous devrez restaurer à la main. Le sp_generate_inserts est bon pour les nouvelles données. mais de mettre à jour les données que je fais de cette façon:

SELECT 'Update YourTable ' 
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL') 
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL') 
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable 

vous pouvez créer des inserts de cette façon aussi, mais sp_generate_inserts est mieux. Regardez ces valeurs d'identité, et bonne chance (j'ai déjà eu ce problème et je sais où vous en êtes actuellement).

requêtes utiles:

--find out if there are missing rows, and which ones 
SELECT 
    b.key,c.key 
    from backupserver.databasename.owner.YourTable b 
     LEFT OUTER JOIN YourTable     c ON b.key=c.key 
    WHERE c.Key is NULL 

--find differences 
SELECT 
    b.key,c.key 
    from YourTable            c 
     LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key 
    WHERE b.Key is not null 
     AND ( ISNULL(c.column1,-9999)  != ISNULL(b.column1,-9999) 
      OR ISNULL(c.column2,'~')  != ISNULL(b.column2,'~') 
      OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE()) 
      ) 
0

SQL Server Management Studio pour SQL Server 2008 vous permet d'exporter des données de table comme instructions d'insertion. Voir http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx. Cette approche manque une partie de la flexibilité de sp_generate_inserts (vous ne pouvez pas spécifier une clause WHERE pour filtrer les lignes de votre table, par exemple) mais peut être plus fiable car elle fait partie du produit.

Questions connexes