MySQL能否为用户分配具体的列级权限?
- 内容介绍
- 文章标签
- 相关推荐
本文共计916个文字,预计阅读时间需要4分钟。
可以,但限制非常具体:
常见误判是以为 GRANT ... ON table(col1, col2) 能覆盖所有权限类型,实际会报错:
ERROR 1221 (HY000): Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES
-
SELECT列权限:控制哪些列能被SELECT查询到(注意:若用户有表级SELECT,列权限会被绕过) -
INSERT列权限:控制INSERT INTO t(c1,c2) VALUES(...)中能显式指定哪些列;但若用INSERT INTO t VALUES(...)(无列名),则需所有列都有INSERT权限才允许 -
UPDATE列权限:只影响SET col = ...中被修改的列,未授权的列即使出现在SET子句中也会报错
列权限必须和表级权限共存,且优先级低于表级权限
这是最容易踩的坑:如果用户已有表级 SELECT 权限,再单独 revoke 某列的 SELECT,不会生效。列权限只在用户**没有对应表级权限**时起作用。
换句话说,列权限是“补充性限制”,不是“独立访问控制”。
本文共计916个文字,预计阅读时间需要4分钟。
可以,但限制非常具体:
常见误判是以为 GRANT ... ON table(col1, col2) 能覆盖所有权限类型,实际会报错:
ERROR 1221 (HY000): Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES
-
SELECT列权限:控制哪些列能被SELECT查询到(注意:若用户有表级SELECT,列权限会被绕过) -
INSERT列权限:控制INSERT INTO t(c1,c2) VALUES(...)中能显式指定哪些列;但若用INSERT INTO t VALUES(...)(无列名),则需所有列都有INSERT权限才允许 -
UPDATE列权限:只影响SET col = ...中被修改的列,未授权的列即使出现在SET子句中也会报错
列权限必须和表级权限共存,且优先级低于表级权限
这是最容易踩的坑:如果用户已有表级 SELECT 权限,再单独 revoke 某列的 SELECT,不会生效。列权限只在用户**没有对应表级权限**时起作用。
换句话说,列权限是“补充性限制”,不是“独立访问控制”。

