web-dev-qa-db-fra.com

SQL Azure - copier la table entre les bases de données

J'essaie d'exécuter le SQL suivant:

INSERT INTO Suppliers ( [SupplierID], [CompanyName]) 
Select  [SupplierID], [CompanyName] From [AlexDB]..Suppliers

et a obtenu une erreur "la référence à la base de données et/ou au nom du serveur n'est pas prise en charge dans cette version du serveur sql"

Une idée comment copier des données entre des bases de données "à l'intérieur" du serveur? Je peux charger des données sur le client et ensuite sur le serveur, mais c'est très lent.

28
Alex Dybenko

Je sais que c'est vieux, mais j'avais une autre solution manuelle pour un tirage unique.

À l'aide de SQL Management Studio R2 SP1 pour me connecter à Azure, je clique avec le bouton droit sur la base de données source et sélectionne générer des scripts.

pendant l'assistant, après avoir sélectionné mes tables, je sélectionne que je veux sortir dans une fenêtre de requête, puis je clique sur avancé. Environ à mi-chemin dans la fenêtre des propriétés, il y a une option pour "type de données à script". Je sélectionne cela et le change en "données uniquement", puis je termine l'assistant.

Tout ce que je fais ensuite est de vérifier le script, de réorganiser les insertions pour les contraintes et de modifier l'utilisation en haut pour l'exécuter sur ma base de données cible.

Ensuite, je clique avec le bouton droit sur la base de données cible et sélectionne une nouvelle requête, y copie le script et l'exécute.

Terminé, les données ont migré.

j'espère que cela aide quelqu'un

65
Mark Jones

Depuis 2015, cela peut être fait en utilisant requêtes de bases de données élastiques également connu sous le nom de requêtes de bases de données croisées .

J'ai créé et utilisé ce modèle, il copie 1,5 million de lignes en 20 minutes:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

CREATE DATABASE SCOPED CREDENTIAL SQL_Credential  
WITH IDENTITY = '<username>',
SECRET = '<password>';

CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
    TYPE=RDBMS,
    LOCATION='<server>.database.windows.net',
    DATABASE_NAME='<db>',
    CREDENTIAL= SQL_Credential
);

CREATE EXTERNAL TABLE [dbo].[source_table] (
    [Id] BIGINT NOT NULL,
    ...
)
WITH
(
    DATA_SOURCE = RemoteReferenceData
)

SELECT *
 INTO target_table
FROM source_table
17
Magu

Malheureusement, il n'y a aucun moyen de le faire dans une seule requête.

La façon la plus simple d'y parvenir est d'utiliser "Data Sync" pour copier les tables. L'avantage de cela est qu'il fonctionnera également entre les serveurs et gardera vos tables synchronisées.

http://Azure.Microsoft.com/en-us/documentation/articles/sql-database-get-started-sql-data-sync/

Dans la pratique, je n'ai pas eu une si grande expérience avec "Data Sync" en cours de production, mais c'est bien pour des emplois ponctuels.

Un problème avec "Data Sync" est qu'il créera un grand nombre d'objets "sync" dans votre base de données, et la suppression de la "Data Sync" réelle du portail Azure peut ou non les nettoyer. Suivez les instructions de cet article pour tout nettoyer manuellement:

https://msgooroo.com/GoorooTHINK/Article/15141/Removing-SQL-Azure-Sync-objects-manually/5215

7
Terence Siganakis

SQL-Azure ne prend pas en charge l'instruction USE et, en fait, aucune requête cross-db. La requête ci-dessus est donc vouée à l'échec.

Si vous souhaitez copier/sauvegarder la base de données vers une autre base de données Azure SQL, vous pouvez utiliser la copie "Même serveur" ou "Cross-Server" dans SQL-Azure. Reportez-vous à cet article msdn

3
IUnknown

Vous pouvez utiliser un outil comme SQL Data Compare de Red Gate Software qui peut déplacer le contenu de la base de données d'un endroit à un autre et prend entièrement en charge SQL Azure. Un essai gratuit de 14 jours devrait vous permettre de voir s'il peut faire ce dont vous avez besoin.

Divulgation complète: je travaille pour Red Gate Software

3
Richard Mitchell

Suivez les étapes suivantes, il n'y a aucun moyen simple de le faire. Mais par une astuce, nous pouvons.

Étape 1: Créez une autre table avec la même structure que la table des fournisseurs dans [AlexDB], dites-la en tant que SuppliersBackup

Étape 2: créer une table avec la même structure que la table des fournisseurs dans DesiredDB

Étape 3: Activer la synchronisation des données entre AlexDB..Suppliers et DesiredDB..Suppliers

Étape 4: tronquer les données d'AlexDB..Suppliers

Étape 5: copie des données d'AlexDB..SuppliersBackup vers AlexDB..Suppliers

Étape 6: exécutez maintenant la synchronisation

Données copiées dans DesiredDB.

3
Vignesh M

Un ancien article, mais une autre option est Assistant de migration Azure Sql

2
ozz

Si vous avez une version onprem qui a le sp_addlinkedsrvlogin, vous pouvez configurer des serveurs liés pour la base de données source et cible, puis vous pouvez exécuter votre insertion dans la requête.

Voir "Prise en charge de SQL Server pour le serveur lié et les requêtes distribuées sur la base de données SQL Azure Windows" dans ce blog: https://Azure.Microsoft.com/en-us/blog/announcing-updates-to-windows-Azure -sql-database /

2
Thomas

Ok, je pense avoir trouvé une réponse - pas question. devez déplacer des données vers le client, ou faire d'autres astuces. Voici un lien vers l'article avec des explications: Limitations de SQL Azure: une seule base de données par connexion Mais toutes les autres idées sont les bienvenues!

1
Alex Dybenko

Je recommanderais la fonction d'importation et d'exportation de SSMS SQL Server. Cette fonctionnalité prend en charge plusieurs configurations de connexion et la copie interserveur des tables sélectionnées. J'ai essayé le connecteur .NET Sql Server, qui fonctionne très bien pour les bases de données Azure SQL.

0
hui chen

Quelques options (plutôt des solutions de contournement):

  1. Générer un script avec des données
  2. Utiliser la synchronisation des données dans Azure
  3. Utilisez MS Access (importation puis exportation), avec de nombreuses exclusions (comme no GUID in Access)
  4. Utilisez des outils tiers comme Red Gate.

Malheureusement, aucun moyen facile et intégré de le faire jusqu'à présent.

0
Vad