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 保护。
posted @ 2026-05-21 09:37  数据库小白(专注)  阅读(18)  评论(0)    收藏  举报