MySQL8.0.16
开始,可以将权限授予给全局,同时取消对某个库的权限。比如可以设置一个用户,对除了mysql
库以外的其他库都具有读写权限,以前,需要对每个库进行读写授权,当有新库增加时,需要为该账号增加新库的读写权限。在MySQL8.0.16
以后,如果启用了取消部分权限功能,可以直接对用户授予全局读写权限,然后取消mysql
的读写权限,之后再有新库增加后,该用户自动具有新库的读写权限,不需要额外添加。
启用取消部分权限功能
通过设置partial_revokes=ON
来启用取消部分权限功能。默认情况下,该功能是禁用的
SET PERSIST partial_revokes = ON;
禁用取消部分权限功能
SET PERSIST partial_revokes = OFF;
当服务器中存在被取消部分权限的用户时,无法对功能进行禁用。
取消部分权限示例
mysql> CREATE USER u1;
mysql> GRANT SELECT, INSERT ON *.* TO u1;
mysql> REVOKE INSERT ON world.* FROM u1;
mysql> SHOW GRANTS FOR u1;
+------------------------------------------+
| Grants for u1@% |
+------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO `u1`@`%` |
| REVOKE INSERT ON `world`.* FROM `u1`@`%` |
+------------------------------------------+
恢复被取消的部分权限
重新授权给全局
GRANT INSERT ON *.* TO u1;
对被取消的权限部分重新授权
GRANT INSERT ON world.* TO u1;
撤销全局授权
REVOKE INSERT ON *.* FROM u1;
mysql如何记录取消部分权限
存储在mysql.user
的User_attributes->>'$.Restrictions'
列
mysql> SELECT User, Host, User_attributes->>'$.Restrictions'
FROM mysql.user WHERE User_attributes->>'$.Restrictions' <> '';
+------+------+------------------------------------------------------+
| User | Host | User_attributes->>'$.Restrictions' |
+------+------+------------------------------------------------------+
| u1 | % | [{"Database": "world", "Privileges": ["INSERT"]}] |
+------+------+------------------------------------------------------+
取消部分权限在SHOW GRANTS中如何显示
显示为一个REVOKE
语句
mysql> SHOW GRANTS FOR u1;
+------------------------------------------+
| Grants for u1@% |
+------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO `u1`@`%` |
| REVOKE INSERT ON `world`.* FROM `u1`@`%` |
+------------------------------------------+
取消部分权限功能限制
- 必须使用库的全名,不能包含通配符(%或_)
- 可以对不存在的库取消权限,前提是必须之前授予过全局权限。
- 取消部分权限进适用于库级别。
权限继承
- 如果一个账号本身已经被取消部分权限,那么当使用这个账号给其他账号授权时,被授权的账号也会被取消部分权限。(被授权账号已具有该账号被取消的权限情况除外)
- 账号授权时只会添加新权限,不会删除现有权限
取消部分权限与复制的关系
partial_revokes
必须在复制的所有主机上同时启用或禁用,否则REVOKE
语句对主从的影响可能不同,从而可能导致复制不一致或错误。
网友评论