在实际项目中,我们经常遇到这样的需求:只允许某个用户读取表中的部分字段,或只能修改指定字段。很多人以为 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
只允许读取id
和name
字段 - 同时允许他更新
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
那样强调字段级权限控制,但实际是支持的。在多用户系统中,字段授权可以更精细地控制数据访问权限,保护敏感字段不被滥用,是一种轻量但有效的数据安全手段。