查有ALTER权限的用户需依次检查mysql.user(全局)、mysql.db(库级)、mysql.tables_priv(表级)三张表,其中mysql.user.alter_priv='Y'表示全局权限,mysql.db.alter_priv='Y'表示库级权限,mysql.tables_priv.column_priv需用find_in_set('Alter', column_priv)查询。

查谁有 ALTER 权限:直接看 mysql.user 表字段最准
ALTER 权限不是单独存成一条记录的,而是以布尔字段形式存在 mysql.user 表里。想快速知道哪些用户能改表结构,就查 alter_priv = 'Y' 的行:
用 root 登录后执行:
SELECT host, user FROM mysql.user WHERE alter_priv = 'Y';
注意:alter_priv 是全局权限,只控制是否能在任意数据库上执行 ALTER TABLE;它不区分库或表——哪怕你只给用户 testdb.* 的权限,只要没开这个字段,他就不能改 testdb 里的任何表。
- 如果结果为空,说明目前没人有全局
ALTER权限(但别急着下结论,继续看下一条) -
host字段值为%表示允许从任意主机连接,localhost则仅限本机,两者权限互不继承 - MySQL 8.0+ 中该字段名仍是
alter_priv,没变;但认证方式变了,别误把authentication_string当权限字段去筛
查库级/表级 ALTER 权限:得翻 mysql.db 和 mysql.tables_priv
全局 alter_priv = 'N' 不代表用户一定不能改表——他可能被授予了某库甚至某张表的 ALTER 权限。这类细粒度授权存在另外两张系统表里:
查对某个数据库有 ALTER 权限的用户:
SELECT host, user, db FROM mysql.db WHERE alter_priv = 'Y';
查对某张表有 ALTER 权限的用户(较少见,但确实支持):
SELECT host, user, db, table_name FROM mysql.tables_priv WHERE find_in_set('Alter', column_priv);
-
mysql.db中的alter_priv是 Y/N 字符串,不是布尔值,别写成= 1 -
mysql.tables_priv.column_priv是逗号分隔字符串,必须用find_in_set()查,不能用LIKE '%Alter%'(会误匹配Alter_routine) - 这种细粒度授权极少在生产环境使用,多数 DBA 直接给库级
ALTER,因为维护成本高、排查困难
验证用户实际能否执行 ALTER TABLE:别信 SHOW GRANTS 的表面输出
SHOW GRANTS FOR 'u'@'h' 看起来最直观,但它只显示显式授予的权限语句,**不合并生效权限**。比如:
- 用户 A 被
GRANT ALTER ON testdb.*,SHOW GRANTS会显示这条 - 但若 A 同时属于角色 R,而 R 有
ALTER权限,SHOW GRANTS默认不显示角色继承来的权限(MySQL 8.0+ 需加USING role_name才能看到) - 更隐蔽的是:如果用户有
ALL PRIVILEGES,SHOW GRANTS显示的是ALL,但你无法从输出反推他是否真能ALTER——得结合当前生效的sql_mode和对象可见性判断
所以最稳妥的验证方式是:用该用户登录,尝试执行一条无害的 ALTER TABLE ... MODIFY COLUMN(比如改个字段注释),看报错是不是 ERROR 1142 (42000): ALTER command denied。
常见误判场景:为什么明明给了 ALTER 还报错?
给权限 ≠ 能成功执行 ALTER TABLE。下面这些情况会导致拒绝,和 ALTER 权限本身无关:
- 目标表被其他会话锁住(如长事务未提交),报错
ERROR 1205 (40001): Deadlock found或超时,容易误以为是权限问题 - 用户没有对应数据库的
USAGE权限(即连库都进不去),ALTER权限根本不会被检查——先得能USE db_name - MySQL 8.0+ 开启了
require_row_format或启用了严格模式,某些ALTER操作会被拦截,报错提示里不含 “denied” 字样,容易混淆 - 用户有
ALTER权限,但没SELECT权限——部分ALTER操作(如ADD COLUMN AS (expr))内部会触发隐式查询,缺SELECT也会失败
ALTER 授权 → 存储引擎兼容性 → 元数据锁状态。漏掉任一环,都会卡在“没权限”的假象里。










