31、用户授权 GRANT

 1、查询权限:

SHOW GRANTS FOR '用户名'@'主机名';

2、授予权限:

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

-- 立即生效
FLUSH PRIVILEGES;

权限类型(privilege_type)

权限说明
ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 更新数据
DELETE 删除数据
CREATE 创建数据库/表
DROP 删除数据库/表
ALTER 修改表结构
INDEX 创建/删除索引
CREATE VIEW 创建视图
SHOW DATABASES 查看数据库列表
PROCESS 查看进程信息
RELOAD 重新加载权限
REPLICATION CLIENT 复制客户端权限
CREATE USER 创建用户

权限说明适用对象
ALL [PRIVILEGES] 所有可用权限(不含 GRANT OPTION 全局/数据库/表
SELECT 查询数据 表、列
INSERT 插入数据 表、列
UPDATE 更新数据 表、列
DELETE 删除数据
CREATE 创建数据库或表 全局、数据库
DROP 删除数据库或表 全局、数据库、表
ALTER 修改表结构
INDEX 创建/删除索引
REFERENCES 外键约束(MySQL 中未实际使用)
EXECUTE 执行存储过程/函数 存储过程
USAGE “无权限”,仅允许连接(默认) 全局

权限级别(priv_level)

格式:

ON [数据库名].[对象名]
级别写法说明
全局权限 *.* 所有数据库、所有表
例:GRANT CREATE USER ON *.* TO ...
数据库权限 db_name.* 某个数据库内所有表
✅ 最常用:test.*
表权限 db_name.tbl_name 某个具体表
例:test.user
列权限 db_name.tbl_name (col1, col2) 需在权限后指定列
存储过程权限 PROCEDURE db_name.proc_name 需加 PROCEDURE 关键字

⚠️ 注意:

  • * 表示“所有”,但不能单独写 *,必须是 db.* 或 *.*
  • 默认数据库可通过 USE db; 设置,但授权时建议写全名

用户标识(user_or_role_specification)

格式:

'用户名'@'主机'
  • 用户名:区分大小写(取决于系统),建议小写。
  • 主机(Host):
    • '%':任意主机(包括远程和本地)
    • 'localhost':仅本机(通过 socket 或 127.0.0.1)
    • '192.168.1.%':支持通配符(网段)
    • '10.0.51.5':具体 IP
    • 'myhost.example.com':域名(需 DNS 解析)

🔐 安全建议:避免使用 'user'@'%',尽量限制为具体 IP 或内网段。

例子

-- 授予整个数据库的所有权限
GRANT ALL PRIVILEGES ON mydatabase.* TO 'dbadmin'@'localhost';

-- 授予特定数据库的特定权限
GRANT SELECT, INSERT, UPDATE ON company.* TO 'app_user'@'%';
GRANT CREATE, DROP, ALTER ON testdb.* TO 'developer'@'192.168.1.%';

3、撤销权限:

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意事项
  • 多个权限用逗号分隔
  • 授权时,数据库名和表名可以用 * 进行通配,代表所有
posted @ 2025-11-18 16:57  chao_xiong  阅读(3)  评论(0)    收藏  举报