mysql - 为 MySQL 中的临时表授予选择

标签 mysql sql temp-tables sql-grant

我有一个 MySQL 数据库,其中一个用户只能访问几个表。此用户已被授予此数据库的 CREATE TEMPORARY TABLES,通过查看查询日志,我可以看到他们创建了一个临时表,然后在尝试从中进行选择时失败了。执行 GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'user'@'localhost'; 不起作用,因为此时该表不存在。

The user comments on this page建议使用 hack 来执行此操作,但我希望有更好的方法。


使用它的代码有点像这样:

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;

在这种情况下,重点是数据(或至少其中的一部分)是实时的。
我需要前两个查询的结果和第三个查询的连接值相同,因此使用子查询将不起作用。

最佳答案

似乎正在进行的工作允许授予临时表的不仅仅是“创建”权限,但似乎尚未完成:http://bugs.mysql.com/bug.php?id=27480 .

您链接到的手册页中提到的解决方法也适用于您。您可以在 MySQL 中跨数据库联接,因此假设您使用变通方法中的 tmp 表技巧,您可以:

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

只需确保在查询中指定数据库(如示例中的 ^^^ 所示),MySQL 将很乐意加入。

关于mysql - 为 MySQL 中的临时表授予选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644382/

相关文章:

SQL "WITH"性能和临时表(可能为 "Query Hint"以简化)

mysql - 如何根据MySQL表中的时间戳重置主键?

mysql - 改进查询

mysql - 如何按仅给出月份和年份的日期范围获取数据

sql - 在 postgres 查询中替换 SELECT 返回值

asp.net - 使用与 Web 服务器分开的 SQL 来提高数据安全性(Windows 2003/SQL 2008)?

sql - 从临时表更新

sql-server-2005 - 为什么要在删除临时表之前立即截断?

mysql - 从现有数据库生成具有点类型属性的实体

mysql - 选择其他表中具有匹配列的行