views:

40

answers:

1

I have a MySQL DB with a user that has access only a few tables. This user has been granted CREATE TEMPORARY TABLES for this database and by watching the query logs, I can see them create a temporary table and then fail while trying to select from it. Doing GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'user'@'localhost'; doesn't work as the table doesn't exist at that point.

The user comments on this page suggest a hack to do this but I would have expected there to be a nicer way.


The code that uses this is sorta like this:

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;

In this case, the whole point is that the data (or at least some of it) is live.
I need the results from the first two queries and the values for the join in the third to be the same so using sub queries won't work.

A: 

There appears to be work in progress to allow granting more than just "create" permissions for temp tables, but doesn't appear to be done yet: http://bugs.mysql.com/bug.php?id=27480.

The workaround mentioned in the man page you linked to would work for you as well. You can join across databases in MySQL, so assuming you did the tmp table trick from the workaround, you could do:

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...

just make sure to specify the databases (as shown by the ^^^ in the sample) in the query and MySQL will happily join away.

Marc B