mysql如何禁止用户创建新表_撤销CREATE与ALTER表权限

张开发
2026/4/20 3:35:06 15 分钟阅读

分享文章

mysql如何禁止用户创建新表_撤销CREATE与ALTER表权限
撤销用户CREATE和ALTER权限后仍能建表是因为权限叠加生效、GRANT OPTION未撤、角色继承或CREATE TEMPORARY TABLES权限遗漏必须全面检查并同步撤销DROP、INDEX等关联权限。撤销用户 CREATE 和 ALTER 权限后仍能建表检查 GRANT OPTION 和角色继承MySQL 中直接 REVOKE CREATE, ALTER ON db.* FROM userhost 不一定生效常见原因是该用户被授予过 GRANT OPTION或通过角色MySQL 8.0间接继承了权限。权限撤销是“叠加式”的不是覆盖式——只要任意一条 GRANT 语句给了 CREATE用户就拥有它。用 SHOW GRANTS FOR userhost 查所有显式授权包括通过 WITH GRANT OPTION 授予的权限MySQL 8.0 要额外查角色执行 SELECT * FROM mysql.role_edges WHERE TO_HOST userhost再对每个角色运行 SHOW GRANTS FOR ROLE role_name撤销时必须明确指定作用域REVOKE CREATE, ALTER ON db_name.* FROM userhost漏掉数据库名如写成 ON *.*会导致撤销失败或范围错误ALTER 权限被绕过注意 RENAME TABLE 和 TRUNCATE 的隐含依赖ALTER 权限控制的是修改表结构但用户仍可能通过其他方式达成类似效果。比如 RENAME TABLE 需要原表和目标表的 ALTER 权限或 DROP CREATE而 TRUNCATE TABLE 实际上等价于 DROP CREATE因此需要 DROP 和 CREATE 权限——即使你只撤了 ALTER没动 DROP 和 CREATE用户照样能清空并重建表。若要真正禁止结构变更必须同时撤销 CREATE、DROP、ALTER、INDEX影响 ADD INDEX、REFERENCES影响外键操作TRUNCATE 无法单独授权它依赖 DROP所以禁止建表的同时务必确认 DROP 也已撤销测试是否生效用目标用户登录后执行 CREATE TABLE t1 (id INT) 和 ALTER TABLE t1 ADD c1 INT观察是否返回 ERROR 1142 (42000): CREATE command denied 类错误权限生效延迟FLUSH PRIVILEGES 并不总是必要MySQL 5.7 及以后版本中大部分 REVOKE 操作会立即生效无需 FLUSH PRIVILEGES只有在直接修改 mysql.user 等系统表后才需要它。误用 FLUSH PRIVILEGES 不仅多余还可能掩盖权限未正确撤销的问题——比如你忘了加 ON db.*执行 FLUSH 后以为生效了其实根本没 revoke 成功。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章