with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
| MAX_STATEMENT_TIME time
grant可以在库、表、函数、存储过程、特定列上授权,且一次性可以为多个用户授予多个对象的权限。其中 with grant option 表示拥有该权限后的用户可以给别的用户授予自身所拥有的权限。
revoke表示收回权限,注意revoke无法收回usage权限。
其中user的表示方法是 '用户名'@'主机名' ,主机名部分可以是主机名,可以是IP地址,可以是localhost,可以是通配符组成的主机名(空的host值也表示所有host,等价于'user_name'@'%')。如下示例:
对于网段地址,可以指定掩码来表示,如192.168.100.1/255.255.255.0,不能使用cidr格式的掩码记录方式,也不能指定非8、16、24、32位的掩码,如192.168.100.1/255.255.255.240是不允许的。
如果在user表中的用户有交叉部分,如root既可以从localhost登录,也可以从127.0.0.1登录,还可以从本机IP192.168.100.61登录,还可以从网段地址192.168.100.%登录,那么到底会从哪个登录?
在读取权限表user到内存中的时候,首先会根据host列的具体性进行排序,然后再根据user列进行具体性排序(即理解为order by host,user),然后从上到下扫描,首次扫描到符合的记录就使用该记录登录。具体性的意思是越具体的user优先级越高,通配符范围越宽的user优先级越低。例如root@localhost的具体性比root@'%'的具体性高,后者又比'%'@'%'的具体性高。
2.2 create user和alter user
在MySQL 5.6.7之前,不要使用这两个命令创建用户和修改用户,因为它们会在mysql.user表的password列设置空串。到mysql5.6.7解决了这个问题。MariaDB可随意使用。
语法:
CREATE [OR REPLACE] USER [IF NOT EXISTS]
user_specification [,user_specification] ...
[WITH resource_option [resource_option] ...]
user_specification:
username [authentication_option]
authentication_option:
IDENTIFIED BY 'authentication_string'
resource_option:
MAX_QUERIES_PER_HOUR count
| MAX_UPDATE_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
例如:
create user 'longshuai'@'127.0.0.1' identified by '123456';
alter user和create user语法基本一致,但在MySQL中有让密码过期的功能,而在MariaDB中不支持该功能。
ALTER USER user_specification [, user_specification] ...
user_specification:
user PASSWORD EXPIRE
例如,让刚才创建的用户过期。
alter user 'longshuai'@'127.0.0.1' password expire;
2.3 记录创建用户的时间
MariaDB/MySQL中user的元数据信息都存放在mysql.user表中,但是在这个表中的信息分类很少,常用的就只有用户类列和权限类列,没有用户的创建时间。
可以通过新增一列来记录用户的创建时间。
alter table mysql.user add column create_time timestamp default current_timestamp;
这样以后新建用户都会记录创建时间。但是显然,对于已有的用户是没有记录时间的,它们的值都为'0000-00-00 00:00:00'。
MariaDB [mysql]> select host,user,create_time from mysql.user;
+---------------------+-----------+---------------------+
| host | user | create_time |
+---------------------+-----------+---------------------+
| localhost | root | 2018-04-21 05:58:19 |
| 127.0.0.1 | root | 2018-04-21 05:58:19 |
| ::1 | root | 2018-04-21 05:58:19 |
| localhost | | 2018-04-21 05:58:19 |
| 192.168.100.% | root | 2018-04-21 05:58:19 |
| 192.168.100.1 | long | 2018-04-21 05:58:19 |
| 127.0.0.1 | longshuai | 2018-04-21 05:58:19 |
| 192.168.100.1 | longshuai | 0000-00-00 00:00:00 |
+---------------------+-----------+---------------------+
2.4 查看用户权限
可以使用show grants语句查看某个user的权限信息。
例如:
MariaDB [mysql]> show grants for 'root'@'localhost';