MySQL 5.7如何给多个数据库同时授权_在GRANT语句中使用通配符

大芳同学_8135

大芳同学_8135

2026-05-24

942人浏览

原创

grant语句中数据库名通配符必须用反引号包裹,如dp%.*,否则会被当作字面库名;%匹配任意长度字符串,_仅匹配单个字符,且仅对数据库名有效,不支持跨库混写权限。

mysql 5.7如何给多个数据库同时授权_在grant语句中使用通配符

GRANT 通配符在数据库名中怎么写才有效

MySQL 的 GRANT 语句支持对数据库名使用 % 和 _ 通配符,但仅限于数据库名部分(即 ON db_name.* 中的 db_name),且必须用反引号包裹,否则会报语法错误或被当作字面量处理。

常见错误是写成 GRANT SELECT ON dp%.* TO 'user'@'%' —— 这里 dp% 没加反引号,MySQL 会尝试查找名为 “dp%” 的实际数据库,而不是做模式匹配。

  • 正确写法:GRANT SELECT ON `dp%`.* TO 'user'@'%'
  • 反引号不是可选的:含通配符的数据库名必须用 ` 包裹,哪怕没特殊字符
  • % 匹配任意长度字符串(包括空),_ 只匹配单个字符;例如 `project_202_` 匹配 project_2024、project_2026,但不匹配 project_202
  • 通配符只在 GRANT 时生效,运行时不会动态扩展——新增的匹配库自动获得权限,无需重新 GRANT

给多个数据库授不同权限,不能只靠一条 GRANT

一条 GRANT 语句只能指定一组权限(如 SELECT, INSERT)作用于一个数据库模式(如 `app_%`.*)。如果你要让同一个用户对 sales 库有 SELECT,对 log 库有 INSERT, UPDATE,就必须分两条写:

  • GRANT SELECT ON sales.* TO 'reporter'@'10.20.%'
  • GRANT INSERT, UPDATE ON log.* TO 'reporter'@'10.20.%'

试图合并成 GRANT SELECT ON sales.*, INSERT ON log.* TO ... 是语法错误。MySQL 不支持跨库混写权限类型。另外注意:两次 GRANT 针对的是同一用户+主机组合,权限会叠加,不是覆盖。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

为什么授权后应用还是报 Access denied

最常被忽略的不是语法,而是主机名匹配逻辑。MySQL 把 'user'@'localhost' 和 'user'@'127.0.0.1' 当作两个完全独立的账号,权限互不影响。

  • 如果应用从本地用 IP 连接(如 mysql -h 127.0.0.1),但你只给了 'user'@'localhost' 权限 → 权限不生效
  • 如果应用从远程连(如 192.168.5.100),而你只授权了 'user'@'localhost' 或 'user'@'127.0.0.1' → 同样失败
  • 检查实际连接账号:登录后执行 SELECT CURRENT_USER();,它返回 MySQL 实际匹配到的 'user'@'host',不是你登录用的用户名
  • FLUSH PRIVILEGES 在 MySQL 5.7+ 通常不需要——正常 GRANT 会自动重载权限表;只有直接改 mysql.db 等系统表后才需手动刷新

通配符授权的安全风险和替代思路

用 `project_%`.* 授权看似省事,但隐含两个现实问题:一是未来新建的库只要名字匹配就自动获得权限,可能超出预期;二是无法为其中某个库单独收权,除非用 REVOKE 精确到库名(而通配符本身不能用于 REVOKE)。

更可控的做法是结合角色(MySQL 8.0+)或脚本化管理,但在 MySQL 5.7 下建议:

  • 优先用明确库名批量生成 GRANT 语句(比如从 SHOW DATABASES LIKE 'project_%' 结果拼接)
  • 避免用 *.* 或 `%`.*,尤其是生产环境——这等于开放所有现有及未来库
  • 若真需动态适配,至少限制主机范围,比如只允 'dev'@'192.168.10.%',而非 'dev'@'%'

通配符是快捷键,不是安全开关;它省下的那几行 SQL,往往要用额外的权限审计和故障排查来还。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4123

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1069

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6001

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2883

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5980

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8001

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1090

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

952

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习