有没有更好的方法来为 MySQL 中的临时表分配权限?

Posted

技术标签:

【中文标题】有没有更好的方法来为 MySQL 中的临时表分配权限?【英文标题】:Is there a better way to assign permissions to temporary tables in MySQL? 【发布时间】:2010-12-25 05:25:59 【问题描述】:

我们的用户以相当低级别的用户身份登录生产数据库,在数据库级别授予 SELECT,并在他们需要访问的特定表上授予 INSERT/UPDATE/DELETE。

他们还拥有创建临时表的权限(我们需要它们来处理一些更复杂的查询)。问题是,虽然他们可以创建临时表,但他们无权将 INSERT 插入其中!

我们发现的一种解决方法是创建一个同名(但只有一个字段)的“真实”(持久?)表,并授予他们插入该表的访问权限。然后,当创建同名的临时表时,系统将使用它,而不是持久表。

mysql> CREATE TEMPORARY TABLE `testing` (`id` INTEGER AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(30));
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO `testing` (`name`) VALUES ('testing');
ERROR 1142 (42000): INSERT command denied to user 'stduser'@'office.companyname.co.uk' for table 'testing'

如果您尝试授予对表的访问权限(在另一个会话中,以 root 身份),您不能:

mysql> GRANT INSERT ON testdb.testing TO 'stduser'@'%';
ERROR 1146 (42S02): Table 'testdb.testing' doesn't exist

所以我的问题是,基本上,我们可以在临时表上授予 INSERT/UPDATE/DELETE 权限,而无需挂起同名的“持久”表吗?

【问题讨论】:

【参考方案1】:

根据MySQL reference:

MySQL 使您能够授予权限 在不支持的数据库或表上 存在。对于表,特权 被授予必须包括 CREATE 特权。

因此,请尝试在上面的授权语句中包含 CREATE 权限。

【讨论】:

我刚刚在测试环境下试过这个,你确实是对的!有点遗憾,您必须授予 CREATE(不仅仅是 CREATE TEMPORARY TABLES),但非常感谢。【参考方案2】:

解决此问题的一种方法是创建一个特殊数据库并授予用户对其的写入权限,然后让它在该特殊数据库中创建这些临时表。

【讨论】:

这有助于其他解决方法,例如重新打开临时表,您可以创建真实的【参考方案3】:

MySQL 授权独立于实际现有的对象-您可以授予(尚)不存在的表,如果要创建表,这些权限将分配给表。这意味着您可以授予用户创建特定表的权限。

我很想为临时表创建一个数据库(称为 temp)并授予用户对该数据库的访问权限。基于数据库的权限比每个对象的权限更容易管理。

【讨论】:

"MySQL 授权独立于实际存在的对象 - 您可以授予(尚未)存在的表,如果要创建表,这些权限将分配给表。"我不认为是这种情况,请参阅上面的错误 1146。

以上是关于有没有更好的方法来为 MySQL 中的临时表分配权限?的主要内容,如果未能解决你的问题,请参考以下文章

哪个更好?在 MySQL 中的磁盘文件或临时表中缓存

MYSQL存储引擎InnoDB(三十五):临时表空间

MySQL中的临时表使用方法讲解

SQL如何把查询出来的多个表创建成一个临时表

临时表或普通表有啥更好的方法?

如何删除没有临时表的 MySQL 表中的所有重复记录