MySQL创建可授权专属受限用户遇权限报错,需补充哪些权限?
MySQL受限用户授权失败问题解决
需求:创建一个专属受限用户,用于新建数据库、新建用户,并能为新用户授予该新数据库的全部权限。
根据MySQL 5.7官方手册,要向任意用户授予任意权限,需满足:
或者,若您拥有mysql系统数据库中权限表的UPDATE权限,则可为任意账号授予任意权限。
已尝试的权限配置
GRANT CREATE, CREATE ROLE, CREATE TEMPORARY TABLES, CREATE USER, DROP ROLE, RELOAD, SHOW DATABASES ON *.* TO `admin-xxx`@`46.x.x.x` WITH GRANT OPTION; GRANT INSERT, SELECT, UPDATE ON `mysql`.* TO `admin-xxx`@`46.x.x.x`;
问题现象
可以正常创建数据库和用户,但执行GRANT语句为新用户授权新数据库权限时,报错:
ERROR 1044 (42000): Access denied for user 'admin-xxx'@'46.x.x.x' to database 'xxx_abc'
当前权限详情
mysql> show grants; +--------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for admin-xxx@46.x.x.x | +--------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT CREATE, RELOAD, SHOW DATABASES, CREATE TEMPORARY TABLES, CREATE USER, CREATE ROLE, DROP ROLE ON *.* TO `admin-xxx`@`46.x.x.x` WITH GRANT OPTION | | GRANT SELECT, INSERT, UPDATE ON `mysql`.* TO `admin-xxx`@`46.x.x.x` | +--------------------------------------------------------------------------------------------------------------------------------------------------------+
问题原因
虽然你拥有mysql系统库的UPDATE权限(可直接修改权限表),但使用GRANT语句执行授权时,要求执行用户本身拥有目标数据库的对应权限,并且具备WITH GRANT OPTION权限。当前你的admin-xxx用户仅拥有全局创建类权限,没有对新创建数据库的操作权限(如SELECT、INSERT等),因此无法通过GRANT语句转授权限。
解决方案
方案1:授予全局数据库操作权限(简便直接)
给admin-xxx授予所有数据库的全部操作权限,并保留转授权限,后续创建的新数据库会自动继承权限:
GRANT ALL PRIVILEGES ON *.* TO `admin-xxx`@`46.x.x.x` WITH GRANT OPTION; FLUSH PRIVILEGES;
方案2:精准授予必要权限(更严格受限)
若希望最小化权限,可仅授予需要转授的数据库操作权限:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON *.* TO `admin-xxx`@`46.x.x.x` WITH GRANT OPTION; FLUSH PRIVILEGES;
方案3:直接修改权限表(符合手册描述)
利用已有的mysql库UPDATE权限,直接修改权限表为新用户授权(无需GRANT语句的权限限制):
- 创建新用户:
CREATE USER 'new-user'@'xxx' IDENTIFIED BY 'password'; - 插入权限记录到
mysql.db表:INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Create_tmp_table_priv, Lock_tables_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) VALUES ('xxx', 'xxx_abc', 'new-user', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'); - 刷新权限:
FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Marki555
相关产品推荐
相关产品推荐

