web-dev-qa-db-fra.com

Comment définir «Activer l'insertion d'identité» pour toutes les tables à la fois lors de l'importation de données dans SQL Server?

J'essaie de copier une base de données à partir d'un serveur distant. Je n'ai pas accès à ses sauvegardes ni à son système de fichiers. Ma base de données de destination sur ma machine de développement doit obtenir toutes les données ainsi que les mêmes structures de tables, y compris les clés primaires avec les paramètres d'identité et le reste des contraintes.

La fonction d'importation/exportation a la possibilité de définir l'insertion d'identité comme indiqué ci-dessous, mais je dois le faire manuellement par table. J'ai plus de 300 tables à copier et la plupart d'entre elles ont des clés primaires d'identité. Cela va être un processus très douloureux de faire la copie plusieurs fois.

Existe-t-il un moyen de définir ce paramètre d'insertion d'identité en une seule fois pour toutes les tables? Ou un autre moyen fiable de copier des bases de données dans une telle configuration? J'utilise SSMS 7.3 contre SQL Server 2014.

enter image description here

5
Tony_Henrich

Vous pouvez créer toutes les tables à la fois dans l'assistant d'importation/exportation. Sur la page Sélectionner les tables et vues source, vous pouvez cocher la case dans la barre source, une fois sélectionné, vous pouvez sélectionner Modifier les mappages et vous verrez Activer l'insertion d'identité en bas.

Select Source Tables and Views

Transfer Settings

8
pix1985

Vous pouvez utiliser Dynamic sql pour le définir pour toutes les tables décrites ici . Si la base de données est volumineuse, je vous suggère de créer un script pour le schéma et créez la base de données Shell/squelette, puis utilisez la sortie bcp et les données d'insertion en bloc . Vous pouvez automatiser cela à l'aide du travail d'agent PowerShell ou SQL.

Alternativement, vous pouvez simplement lancer une sauvegarde copy_only et utiliser copy-dbadatabase (partie de dbatools - basé sur powershell) pour sauvegarder et restaurer la base de données de la source à la destination.

1
Kin Shah

Je pense que vous pouvez faire ce que vous voulez en créant le package d'importation en utilisant OLE composants source/destination DB avec l'insertion d'identité par défaut. Enregistrez-le dans un fichier de package au lieu de l'exécuter immédiatement. Ouvrez la source du package dans un éditeur de texte et remplacez globalement la propriété FastLoadKeepIdentity par true toutes les tables de destination. Modifiez-la ensuite manuellement par false pour les tables sans colonnes d'identité.

Vous trouverez ci-dessous un fragment xml de la source du package qui doit être modifié.

        <property
          dataType="System.Boolean"
          description="Indicates whether the values supplied for identity columns will be copied to the destination. If false, values for identity columns will be auto-generated at the destination. Applies only if fast load is turned on."
          name="FastLoadKeepIdentity">true</property>

Enregistrez le package modifié, puis exécutez-le à l'aide de l'utilitaire de ligne de commande dtexec.exe ou de l'outil graphique dtexecui.exe. Cela vous permettra de répéter facilement la copie sans passer par l'assistant d'importation/exportation.

1
Dan Guzman

J'ai utilisé Toad pour créer les instructions d'insertion. C'est un produit commercial et a un essai gratuit.

0
Tony_Henrich