授予前端开发人员 select 权限的唯一安全写法是 grant select on db_name. to 'user'@'host'; 必须避免 usage、.* 和主机名不匹配三类错误,且需确保 host 与实际连接方式一致,授权后建议执行 flush privileges 并用新连接验证。

直接给前端开发人员授 SELECT 权限到目标库即可,但必须避开 USAGE、*.* 和主机名不匹配这三类典型错误,否则权限无效或暴露系统库。
GRANT SELECT ON db_name.* 是唯一安全写法
只读权限不是“不给写权限”,而是显式授予 SELECT 并限定范围。MySQL 不会默认继承或推断作用域,漏掉 .* 会报语法错误,多写一个 .*(如 db_name.*.*)也会失败。
-
GRANT SELECT ON myapp.* TO 'fe_dev'@'192.168.10.%';✅ 正确:库级精确授权 -
GRANT SELECT ON myapp TO 'fe_dev'@'%';❌ 报错:ERROR 1064 (42000),缺少.* -
GRANT SELECT ON *.* TO 'fe_dev'@'%';❌ 危险:可读mysql、information_schema等系统库 -
GRANT USAGE ON myapp.* TO 'fe_dev'@'%';❌ 无效:USAGE表示“零权限”,不是只读
host 值必须和实际连接方式一致
前端开发人员从哪连,'fe_dev'@'host' 的 host 就得填哪。MySQL 认证时严格比对这个字符串,不自动模糊匹配。
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 本地用
mysql -u fe_dev -p连?用'fe_dev'@'localhost'—— 注意:它不接受127.0.0.1或::1(IPv6) - 从 CI/CD 或测试机(如
192.168.10.45)连?用'fe_dev'@'192.168.10.%'或'fe_dev'@'192.168.10.45' - 用
'fe_dev'@'%'?允许任意 IP,但禁止通过localhost连(socket 优先),容易调试失败 - 不确定时先查:
SELECT user, host FROM mysql.user WHERE user = 'fe_dev';
FLUSH PRIVILEGES 不是每次都要执行
用 GRANT 授权后,大多数 MySQL 版本(5.7+、8.0)会自动刷新权限缓存;只有直改 mysql.user 表或旧版本部署才强制需要。但加一句没坏处,且能避免因版本差异导致的权限延迟生效。
- 执行
GRANT SELECT ON myapp.* TO 'fe_dev'@'192.168.10.%';后,建议跟一句FLUSH PRIVILEGES; - 不要依赖旧连接验证权限:已建立的连接仍持有赋权前的权限快照,必须新开连接测试
- 验证命令:
SHOW GRANTS FOR 'fe_dev'@'192.168.10.%';输出应只含SELECT和目标库
MySQL 8.0.22+ 可额外启用数据库级只读开关
如果前端只查数据、绝不允许任何 DDL/DML(包括 CREATE VIEW、TRUNCATE 等隐式写操作),可在授完用户权限后,再对库本身设 READ ONLY。该开关对所有用户立即生效,且优先级高于用户权限。
- 启用:
ALTER SCHEMA myapp READ ONLY = 1; - 查看状态:
SELECT OPTIONS FROM INFORMATION_SCHEMA.SCHEMATA_EXTENSIONS WHERE SCHEMA_NAME = 'myapp';(返回READ ONLY=1) - 注意:
READ ONLY是库级开关,不影响其他库;但拥有SUPER权限的用户仍可绕过 - 关闭:
ALTER SCHEMA myapp READ ONLY = 0;
真正容易被忽略的点是:前端开发人员可能用 GUI 工具(如 DBeaver、TablePlus)连库,这些工具默认执行 SHOW DATABASES 和 SHOW TABLES,而 SHOW DATABASES 的可见性与权限无关——只要用户存在,就会列出所有库名。这不是权限泄漏,但会让前端误以为自己有跨库访问能力,需提前说明。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










