Mysql8.0的存储过程权限问题
Mysql8.0的存储过程权限问题
目录
下面按 MySQL 5.7 和 MySQL 8.0 分别给你一套 “只读查询权限” 的标准授权方案,包含:表 / 视图 / 存储过程 / 函数 的“查看与执行(不修改)权限”,可直接用于生产。
一、MySQL 5.7 授权方案(查询 + 过程可查看)
✅ 推荐授权(最小只读)
GRANT
SELECT,
SHOW VIEW,
EXECUTE
ON DB1.*
TO 'user'@'%';
权限说明(5.7)
| 权限 | 作用 |
|---|---|
| SELECT | 查询表、视图 |
| SHOW VIEW | 查看视图定义 |
| EXECUTE | 调用存储过程 / 函数 |
📌 注意(MySQL 5.7 特性)
- 没有 SHOW ROUTINE 权限
- 只要有 EXECUTE,即可(但是否可见完整定义,仍受 DEFINER 影响):
SHOW CREATE PROCEDURE proc_name;
SHOW CREATE FUNCTION func_name;
(但是否可见完整定义,仍受 DEFINER 影响)
二、MySQL 8.0 授权方案(查询 + 完整对象可见)
✅ 推荐授权(最小只读)
GRANT
SELECT,
SHOW VIEW,
EXECUTE,
SHOW ROUTINE
ON DB1.*
TO 'user'@'%';
权限说明(8.0)
| 权限 | 作用 |
| ------------ | ----------- |
| SELECT | 表 / 视图查询 |
| SHOW VIEW | 查看视图 SQL |
| EXECUTE | 调用存储过程 / 函数 |
| SHOW ROUTINE | 查看过程 / 函数定义 |
📌 重点(MySQL 8.0)
- SHOW ROUTINE 是 8.0 新增
没有它:SHOW CREATE PROCEDURE 只能看到空定义
即使有它:
DEFINER ≠ 当前用户 → 过程体仍可能不可见(安全设计)
三、MySQL 5.7 vs 8.0 对比总结
| 功能 | MySQL 5.7 | MySQL 8.0 |
|---|---|---|
| 查询表 | SELECT | SELECT |
| 查询视图 | SELECT | SELECT |
| 查看视图定义 | SHOW VIEW | SHOW VIEW |
| 调用过程 / 函数 | EXECUTE | EXECUTE |
| 查看过程 / 函数定义 | EXECUTE(间接) | SHOW ROUTINE |
| DEFINER 保护 | 较弱 | 更严格 |
四、验证命令(通用)
SHOW GRANTS FOR 'user'@'%';
SHOW CREATE VIEW DB1.v_test;
SHOW CREATE PROCEDURE DB1.p_test;
SHOW CREATE FUNCTION DB1.f_test;
五、生产环境最佳实践(非常重要)
- 只读账号 ≠ DEFINER
- 想“看源码”:改 DEFINER或 DBA 账号查看
- ❌ 不要给系统用户或者超级管理员账号:
SUPER
SYSTEM_USER
一句话结论(可直接写进规范)
- MySQL 5.7:SELECT + SHOW VIEW + EXECUTE
- MySQL 8.0:SELECT + SHOW VIEW + EXECUTE + SHOW ROUTINE
即可满足数据库对象的只读查询需求。
只看、不允许执行存储过程
目标:只看(表 / 视图 / 存储过程 / 函数定义),不允许执行存储过程 / 函数
一、先给结论(非常重要)
⚠️ MySQL 的现实限制
MySQL 原生权限模型中:
👉 “查看存储过程 / 函数定义” 与 “执行” 是强耦合的
也就是说:
- MySQL 5.7:❌ 做不到
- MySQL 8.0:⚠️ 部分可做到,但有前提
下面分别说明。
二、MySQL 5.7 —— ❌ 无法实现
原因
- MySQL 5.7 没有 SHOW ROUTINE 权限
- 查看过程 / 函数定义只能依赖:EXECUTE或 DEFINER / SUPER
➡️ 结论:
5.7 中:只看、不执行 = 做不到
5.7 最接近方案(但不满足要求)
GRANT
SELECT,
SHOW VIEW
ON DB1.*
TO 'user'@'%';
结果:
- ❌ 看不到 SHOW CREATE PROCEDURE
- ❌ 看不到函数体
三、MySQL 8.0 —— ✅ 可实现(生产可用)
✅ 前提条件(必须同时满足)
- 1️⃣ MySQL ≥ 8.0
- 2️⃣ 不给 EXECUTE 权限
- 3️⃣ 给 SHOW ROUTINE 权限
- 4️⃣ 过程 DEFINER = 当前用户 或 DBA 可见
✅ 推荐授权(只看、不执行)
GRANT
SELECT,
SHOW VIEW,
SHOW ROUTINE
ON DB1.*
TO 'user'@'%';
🚫 不要授予:
EXECUTE
| 操作 | 是否允许 |
|---|---|
| SELECT 表 | ✅ |
| SELECT 视图 | ✅ |
| SHOW CREATE VIEW | ✅ |
| SHOW CREATE PROCEDURE | ✅(受 DEFINER 影响) |
| SHOW CREATE FUNCTION | ✅(受 DEFINER 影响) |
| CALL 存储过程 | ❌ |
| SELECT func() | ❌ |
四、关键限制(必须认清)
1️⃣ DEFINER 仍然是“硬门槛”
那么:
- 过程体 可能为空
- 这是 MySQL 8 的安全设计
👉 解决办法(生产合规): - 改 DEFINER
- 或 DBA 账号查看
五、一句话结论(可写进制度)
- MySQL 5.7 无法做到“只看、不执行存储过程”。
- MySQL 8.0 可通过 SHOW ROUTINE + 不授予 EXECUTE 实现,但仍受 DEFINER 保护。

浙公网安备 33010602011771号