mysql用户需显式授予create temporary tables数据库级权限,格式为grant create temporary tables on db_name.* to 'user'@'host';该权限独立于select、usage或create,且临时表仅限当前会话、不可跨库引用。
mysql 用户默认没有 create temporary tables 权限,必须显式授权才能用 create temporary table;不授权会报错 error 1142 (42000): create temporary tables command denied。
怎么给用户加 CREATE TEMPORARY TABLES 权限
这个权限属于「数据库级」权限(不是全局,也不是表级),授权时必须指定数据库名(哪怕只是临时表,也得绑定到某个库):
- 用
GRANT CREATE TEMPORARY TABLES ON <database_name>.* TO 'user'@'host';</database_name>,不能写成ON *.*(MySQL 8.0+ 允许但不推荐,5.7 及以前会报错) - 如果用户需要在多个库建临时表,得逐个授权,比如
GRANT CREATE TEMPORARY TABLES ON db_a.* TO 'u1'@'%'; GRANT CREATE TEMPORARY TABLES ON db_b.* TO 'u1'@'%'; - 执行完记得
FLUSH PRIVILEGES;(仅当用INSERT INTO mysql.user等直改表方式时才必须;用GRANT语句通常自动生效)
为什么不能只给 SELECT 或 USAGE 就够用
临时表权限是独立的,和读写普通表无关。常见误解是:“我都能查 information_schema,为啥还不能建临时表?”——因为 CREATE TEMPORARY TABLES 是单独的权限位,MySQL 不做隐式推导:
-
SELECT权限只管读,不管建表 -
USAGE是空权限,连登录都未必能过(取决于认证插件) - 即使有
CREATE权限,也不包含临时表能力(CREATE是指普通表)
CREATE TEMPORARY TABLE 的实际使用限制
授权只是第一步,真正用起来还有几个硬约束:
- 临时表只对当前 session 可见,断开连接就自动销毁,所以权限检查发生在
CREATE TEMPORARY TABLE执行时,而不是连接时 - 不能跨库引用:比如在
db_a授权了,但CREATE TEMPORARY TABLE t1 AS SELECT * FROM db_b.real_table;会失败,除非也对db_b授了SELECT权限 - 从 MySQL 8.0.12 开始,
CREATE TEMPORARY TABLES权限可被WITH GRANT OPTION传递,但极少有场景需要这么做
最常被忽略的是:权限必须绑定具体数据库,且临时表的 SELECT 源表权限要另算——光有建表权,不等于能随便捞数据塞进去。










