为 MySQL 中的临时表授予选择权限
我有一个 MySQL 数据库,其用户只能访问几个表。该用户已被授予此数据库的CREATE TEMPORARY TABLES
权限,通过观察查询日志,我可以看到他们创建了一个临时表,然后在尝试从中进行选择时失败。执行 GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'user'@'localhost';
不起作用,因为此时该表不存在。
此页面上的用户评论建议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;
在这种情况下,重点是数据(或至少其中一些)是实时的。
我需要前两个查询的结果和第三个查询中的联接值相同,因此使用子查询不起作用。
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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
似乎正在进行的工作允许授予临时表的不仅仅是“创建”权限,但似乎尚未完成:http://bugs.mysql.com/bug.php?id=27480。
您链接到的手册页中提到的解决方法也适合您。您可以在 MySQL 中跨数据库连接,因此假设您执行了解决方法中的
tmp
表技巧,您可以这样做:只需确保指定数据库(如示例中的 ^^^ 所示)在查询中,MySQL 会愉快地加入。
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:just make sure to specify the databases (as shown by the ^^^ in the sample) in the query and MySQL will happily join away.