只给show view权限无法查看普通表结构,因为该权限仅对视图生效;查看普通表需访问information_schema.tables和columns等系统表,必须额外授予其select权限(mysql 8.0.26+支持),同时严格禁用业务库的select权限,才能实现纯看结构不查数据的安全隔离。

只给SHOW VIEW权限为什么查不了普通表结构
因为SHOW VIEW只对视图生效,对普通表执行DESCRIBE table_name或SHOW CREATE TABLE时,MySQL底层会去查INFORMATION_SCHEMA.COLUMNS、INFORMATION_SCHEMA.TABLES这些系统表——而访问它们需要SELECT权限。所以单授SHOW VIEW,用户连DESCRIBE users都会报错ERROR 1142。
MySQL 8.0+ 正确做法:显式授权INFORMATION_SCHEMA子集
必须组合授予三类权限:
-
GRANT SHOW VIEW ON your_db.* TO 'dev'@'%';(允许看视图定义) GRANT SELECT ON INFORMATION_SCHEMA.TABLES TO 'dev'@'%';GRANT SELECT ON INFORMATION_SCHEMA.COLUMNS TO 'dev'@'%';
注意:INFORMATION_SCHEMA在 MySQL 8.0.26+ 才支持按表细粒度授权;5.7 及更早版本不支持,此时“纯看结构不查数据”无法真正隔离。
授完立刻执行FLUSH PRIVILEGES;(尤其在容器或某些配置下,权限不会自动刷新)。
必须同步禁用业务库的SELECT权限
哪怕只授了INFORMATION_SCHEMA,只要用户对业务库有SELECT,就能直接查数据。所以务必确认:
-
SHOW GRANTS FOR 'dev'@'%'输出里**不能出现任何SELECT ON your_db.*或SELECT ON *.*** - 如果已有残留,执行
REVOKE SELECT ON your_db.* FROM 'dev'@'%'; - 检查
mysql.db表:SELECT Select_priv FROM mysql.db WHERE User='dev' AND Db='your_db'\G,结果必须是N
别信“我没给SELECT,他就不能查”——历史GRANT ALL、角色继承、甚至监控工具悄悄加的权限,都可能让SELECT偷偷复活。
验证时别只看GRANTS,要真连进去试
用新用户登录后,跑这两条命令:
-
DESCRIBE your_db.users;→ 应成功返回字段列表 -
SELECT * FROM your_db.users LIMIT 1;→ 必须报错ERROR 1142 (42000): SELECT command denied
如果第二条没报错,说明SELECT权限还在某处活着——重点排查INFORMATION_SCHEMA是否被误授了全库SELECT、用户是否属于某个带SELECT的角色、或者MySQL启用了skip-grant-tables(开发环境偶见,生产严禁)。











