2008-12-03 10 views
5

Je suis en train de le port des données au-dessus de ma base de données de production à mon bac à sable à l'aide d'une requête comme ceci:Comment activer les jointures entre bases de données dans mysql?

INSERT `dbsandbox`.`SomeTable`(Field1, Field2, Field3) 
SELECT t.Field1, t.Field2, t.Field3 
FROM `dbprod`.`SomeTable` t; 

Lorsque je tente cette croix-base de données rejoindre je reçois l'erreur suivante:

erreur 1142 (42000): Commande SELECT refusée à l'utilisateur 'myusername'@'server.domain.tdl' pour la table 'SomeTable'

L'utilisateur en question a l'autorisation des tables en question pour les deux bases de données. J'ai essayé ceci dans le client d'unix mysql et l'application de navigateur de fenêtres de MySQL avec le même résultat.

Qu'est-ce qui me manque?

Répondre

8

Il s'est avéré que c'était un problème de permissions. La base de données source nécessitait un mot de passe pour le nom d'utilisateur que j'utilisais afin d'accéder à toutes les tables. La cible ne nécessite que le nom d'utilisateur sur l'hôte local.

Même si je lance le client MySQL en utilisant un mot de passe à chaque fois dans le contexte d'une requête inter-base de données, une autre connexion est tentée. Cette connexion ne se souvient pas que je me suis initialement authentifié contre le client avec un mot de passe, de sorte que la connexion du sandbox à la base de données de production a échoué. Apparemment, le fait d'indiquer explicitement le nom de la base de données pour une table implique parfois le besoin d'une autre connexion.

La réponse a été d'initier la requête à partir de la base de données de production, de se référer aux tables locales sans le qualificateur de base de données, puis de les insérer dans les tables de base de données sandbox. Cette fois, il a travaillé:

UTILISATION DBPROD

INSERT dbsandbox. SomeTable (Champ1, Champ2, Champ3) SELECT t.Field1, t.Field2, t.Field3 FROM SomeTable t;

4

Cela ressemble à un problème d'autorisations. Les autorisations utilisateur sont souvent configurées sur une base de données dans une base de données, de sorte que l'utilisateur de la destination n'a pas accès à la source.

Assurez-vous d'abord que vous pouvez faire la sélection à partir de la base de données source.

SELECT t.Field1, t.Field2, t.Field3 
FROM `dbprod`.`SomeTable` t; 

Est-ce que cela fonctionne? Si ce n'est pas le cas, vous devez accorder à l'utilisateur des autorisations de sélection sur la base de données source.

Les deux bases de données sont sur/dans le même serveur non?

+0

Oui, les deux bases de données se trouvent sur le même serveur. L'instruction select fonctionne, qu'elle soit émise lors de l'utilisation de dbprod ou de dbsandbox. – Chris

+0

Avez-vous la même erreur sans INSERT? – dkretz

+0

Non. Si je fais juste le SELECT, je n'obtiens aucune erreur. – Chris

Questions connexes