2010-09-04 5 views
2

J'ai une base de données MySQL avec un utilisateur qui n'a accès qu'à quelques tables. Cet utilisateur a été accordé CREATE TEMPORARY TABLES pour cette base de données et en regardant les journaux de requête, je peux les voir créer une table temporaire, puis échouer en essayant d'en sélectionner. Faire GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'user'@'localhost'; ne fonctionne pas car la table n'existe pas à ce stade. Suggérer un hack pour le faire mais je m'attendrais à ce qu'il y ait une meilleure façon de faire.subvention sélectionnez pour la table temporaire dans MySQL


Le code qui utilise est sorta comme ceci:

CREATE TEMPORARY TABLE t1 SELECT id FROM real1 LIMIT 10; 
CREATE TEMPORARY TABLE t2 SELECT id FROM real2 LIMIT 10; 

SELECT * FROM t1; 
SELECT * FROM t2; 
SELECT * FROM t1 JOIN t2 JOIN real3 AS r ON t1.id = r.a AND t2.id = r.b; 

Dans ce cas, le fait est que les données (ou au moins une partie de celui-ci) est en direct.
J'ai besoin des résultats des deux premières requêtes et les valeurs de la jointure dans le troisième sont les mêmes, donc l'utilisation des sous-requêtes ne fonctionnera pas.

Répondre

1

Il semble y avoir des travaux en cours pour permettre d'accorder plus que des autorisations de "création" pour les tables temporaires, mais cela ne semble pas encore avoir été fait: http://bugs.mysql.com/bug.php?id=27480.

La solution de contournement mentionnée dans la page de manuel à laquelle vous avez établi un lien fonctionnerait également pour vous. Vous pouvez vous joindre à travers les bases de données MySQL, donc en supposant que vous avez fait le tour de table tmp de la solution de contournement, vous pouvez faire:

SELECT tmp.t1.a, tmp.t2.b, realdb.real3.c FROM tmp.t1 
     ^^^  ^^^  ^^^^^^ 
JOIN tmp.t2 ON tmp.t1.somefield=tmp.t2.otherfield 
    ^^^  ^^^    ^^^ 
JOIN realdb.real3 ON tmp.t2.yetanotherifeld = realdb.real3.yetanotherotherfield 
    ^^^^^^   ^^^      ^^^^^^ 
etc... 

Assurez-vous de spécifier les bases de données (comme le montre le ^^^ dans l'échantillon) dans la requête et MySQL se joindra joyeusement.

Questions connexes