​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​​语句对主从的影响可能不同,从而可能导致复制不一致或错误。