我们先介绍mysql系统库中的权限系统表。 在mysql系统库中,MySQL访问权限系统表包含如下几个表。
提示:
要更改权限表的内容,推荐使用账号管理语句(如:CREATE USER、GRANT、REVOKE等)来间接修改,不建议直接使用DML语句修改权限表,否则后果自负。 以下内容主要针对MySQL 5.7版本进行整理。
user表提供查询全局权限信息。该表中的账号密码信息在认证1阶段(关于认证阶段 的相关内容,我们会在后面的文章中进行介绍)决定着是否允许用户连接,对于通过账号密码认证阶段的连接,如果同时通过user表中的权限检查,那么就代表该用户拥有全局权限。 该表中记录的权限信息代表用户是否拥有该实例下所有数据库的相应全局权限。
注意:如果在user表中有任意一个权限字段值为Y的,就被认为拥有全局权限,所以用户在使用SHOW DATABASES或者information_schema下的schemata表查询时,可以查询到所有数据库名称列表。 下面是该表中存储的信息内容。
@localhost:[mysql]>select * from user limit 1\G
*************************** 1. row ***************************
Host: localhost
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
password_last_changed: 2021-12-02 14:23:49
password_lifetime: NULL
account_locked: N
1 row in set (0.00 sec)
表字段含义如下。
Host和User:官方称为范围字段,可以理解为这两个字段构成了允许访问的客户端范围,以及客户端可以访问的数据库资源范围(这里没有像db表那样的Db字段限制库范围,可以理解为整个实例范围的数据库)。
权限字段:从Select_priv到Create_tablespace_priv之间的字段,官方称为权限字段。每一个字段对应一个具体的权限,值为Y代表有权限,值为N代表没有权限。
以下字段官方称为安全配置字段,与客户端和服务端之间的安全、加密通信有关。
以下字段官方称为资源控制字段,用于限制用户的一些访问资源。
db表提供查询库级别的对象权限信息。该表中记录的权限信息代表用户是否可以使用 这些权限来访问被授予访问的数据库下的所有对象(表或存储程序)。 下面是该表中存储的信息内容。
@localhost:[mysql]>select * from db limit 1\G
*************************** 1. row ***************************
Host: localhost
Db: performance_schema
User: mysql.session
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
1 row in set (0.00 sec)
表字段含义如下。
Host、Db、User:官方称为范围字段,可以理解为这三个字段构成了允许访问的客户端范围,以及客户端可以访问的数据库资源范围。
xxx_priv:与user表的xxx_priv字段含义相同,每一个字段都对应相应的权限,值为Y代表有权限,值为N代表没有权限。与user表相比,少了Reload_priv、 Shutdown_priv、Process_priv、File_priv、Show_db_priv、Super_priv、Repl_slave_priv、Repl_client_priv、Create_user_priv、Create_tablespace_priv等字段,即代表这些字段对应的权限是全局范围的,不区分库表级别。
tables_priv表提供查询表级别的权限信息。与db表类似,但粒度更细,tables_priv表中记录的权限信息代表用户是否可以使用这些权限访问某个表中的所有字段。
下面是该表中存储的信息内容。
@localhost:[mysql]>select * from tables_priv limit 1\G
*************************** 1. row ***************************
Host: localhost
Db: mysql
User: mysql.session
Table_name: user
Grantor: boot@connecting host
Timestamp: 0000-00-00 00:00:00
Table_priv: Select
Column_priv:
1 row in set (0.00 sec)
表字段含义如下。
Host、Db、User、Table_name:官方称为范围字段,可以理解为这几个字段构成 了允许访问的客户端范围,以及客户端可以访问的表对象资源范围。
Table_priv和Column_priv:官方称为权限字段,对应于表级别权限和字段级别权限。需要注意的是,这两个权限字段与user表和db表不同,它们是set类型的,记录着表级 别和字段级别的权限集合,而不是对应于具体的某个权限。Table_priv对应于表级别的 Select, Insert, Update, Delete, Create,Drop,Grant,References,Index,Alter,CreateView,Showview,Trigger权限,Column_priv对应于字段级别的Select,Insert,Update,References权限。
Grantor:代表该表中记录的用户权限是被谁授予的,即该表中的用户权限被授予时的current_user函数返回的用户值(account形式)。
Timestamp:代表授予Grantor表示的用户权限时的时间戳。
columns_priv表提供查询字段级别的权限信息。与db表类似,但粒度更细,columns_priv表中记录的权限信息代表用户可以使用这些权限来访问某个表的指定字段。
下面是该表中存储的信息内容。
ljc@localhost:[mysql]>show create table columns_priv \G
*************************** 1. row ***************************
Table: columns_priv
Create Table: CREATE TABLE `columns_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges'
1 row in set (0.00 sec)
表字段含义如下。
Host、Db、User、Table_name、Column_name:官方称为范围字段,可以理解为 这几个字段构成了允许访问的客户端范围,以及客户端可以访问的字段对象资源范围。
Column_priv:官方称为权限字段,与tables_priv表中的Column_priv字段含义相 同,也是一个集合类型,对应于字段级别的Select, Insert,Update, References权限。
Timestamp:与tables_priv表中的Timestamp字段含义相同。
procs_priv表提供查询存储程序(存储过程和函数)的权限信息。该表中记录的权限 信息代表用户是否可以使用这些权限来访问指定的存储程序。 表字段含义如下。
Host、Db、User、Routine_name、Routine_type:官方称为范围字段,可以理解为 这几个字段构成了允许访问的客户端范围,以及客户端可以访问的存储对象资源。
Proc_priv:官方称为权限字段,该权限字段也是一个集合类型,代表存储程序的 Execute, Alter Routine, Grant权限。
Timestamp:与tables_priv表中的Timestamp字段含义相同。
Grantor:与tables_priv表中的Grantor字段含义相同。
提示:该表权限数据为空,目前还未找到向表中填充数据的方法。
proxies_priv表提供查询代理用户的权限信息。该表中记录的权限信息代表用户可以充当哪些用户的代理,以及用户是否可以将Proxy权限授予其他用户。 如果一个用户需要将它的Proxy权限授予其他用户,那么该用户必须在该表中有一行权限信息,且With_grant字段值必须为1。
下面是该表中存储的信息内容。
@localhost:[mysql]>select * from proxies_priv \G
*************************** 1. row ***************************
Host: localhost
User: root
Proxied_host:
Proxied_user:
With_grant: 1
Grantor: boot@connecting host
Timestamp: 0000-00-00 00:00:00
1 row in set (0.00 sec)
表字段含义如下。
Host、User:这两个字段的含义与前面的权限表相同。
Proxied_host和Proxied_user:表示Proxy权限的来源account(被代理的用户)对应 的Host和User字符串。
其他字段的含义和tables_priv表相同。
注意:对于所有的权限表,一些字段有长度存储限制,具体如下。
User