Karp 的技术博客

在实际项目中,我们经常遇到这样的需求:只允许某个用户读取表中的部分字段,或只能修改指定字段。很多人以为 MySQL 只支持库级或表级权限,其实从 MySQL 5.0 开始就支持“字段级权限控制”,在 MySQL 8.0 中依然有效

✅ 字段级权限控制语法

MySQL 中的字段级权限主要支持以下几种操作:

  • SELECT
  • UPDATE
  • INSERT

字段授权语法格式如下:

GRANT 权限类型 (字段1, 字段2) ON 数据库.表 TO '用户名'@'主机';

🔧 示例:授予用户字段级权限

假设我们有如下用户表 db1.t1

CREATE TABLE db1.t1 (
  id INT,
  name VARCHAR(100),
  age INT
);

我们希望:

  • 用户 Mike 只允许读取 idname 字段
  • 同时允许他更新 age 字段,但不能查看或更新其他字段

授权语句如下:

GRANT SELECT (id, name), UPDATE (age) ON db1.t1 TO 'Mike'@'%';

🔍 查看授权结果

执行以下命令可以查看用户当前拥有的权限:

SHOW GRANTS FOR 'Mike'@'%';

输出示例:

GRANT SELECT (id, name), UPDATE (age) ON `db1`.`t1` TO 'Mike'@'%'

✅ 权限效果验证

登录 Mike 用户后测试以下操作:

-- ✅ 允许读取授权字段
SELECT id, name FROM db1.t1;

-- ❌ 无权访问未授权字段
SELECT age FROM db1.t1; -- 报错:没有 SELECT 权限

-- ✅ 允许更新 age 字段
UPDATE db1.t1 SET age = 30 WHERE id = 1;

-- ❌ 无权更新其他字段
UPDATE db1.t1 SET name = 'Tom' WHERE id = 1; -- 报错:没有 UPDATE 权限

⚠️ 注意事项

项目说明
✅ 支持的操作类型SELECT, UPDATE, INSERT
❌ 不支持的操作类型DELETE, EXECUTE, ALTER, DROP
限制说明字段级授权只适用于 ,不适用于 视图、存储过程、函数等对象
查询限制用户仅可访问授权字段,访问未授权字段将报错

🛠 撤销字段权限

如需撤销权限,可以使用 REVOKE 语法:

REVOKE SELECT (id, name), UPDATE (age) ON db1.t1 FROM 'Mike'@'%';

📌 总结

MySQL 虽然不像 Oracle 那样强调字段级权限控制,但实际是支持的。在多用户系统中,字段授权可以更精细地控制数据访问权限,保护敏感字段不被滥用,是一种轻量但有效的数据安全手段。

mysql

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2025年06月03日 07:38
1

目录

来自 《MySQL 8.0 字段级权限控制详解:支持 `SELECT`、`UPDATE` 等列级授权》