文章目录
- user 表
- db 表
- tables_priv 表
- columns_priv表
MySQL 数据库中与权限相关的表:user、db、tables_priv、columns_priv。
user 表
mysql> select * from mysql.user\G
*************************** 1. row ***************************Host: localhostUser: rootSelect_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YReload_priv: YShutdown_priv: YProcess_priv: YFile_priv: YGrant_priv: YReferences_priv: YIndex_priv: YAlter_priv: YShow_db_priv: YSuper_priv: YCreate_tmp_table_priv: YLock_tables_priv: YExecute_priv: YRepl_slave_priv: YRepl_client_priv: YCreate_view_priv: YShow_view_priv: YCreate_routine_priv: YAlter_routine_priv: YCreate_user_priv: YEvent_priv: YTrigger_priv: Y
Create_tablespace_priv: Yssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0max_updates: 0max_connections: 0max_user_connections: 0plugin: mysql_native_passwordauthentication_string: *6969E01196BECE74725D5CD9F8C58F1D7529C352password_expired: Npassword_last_changed: 2020-07-27 10:06:49password_lifetime: NULLaccount_locked: N
mysql.user
表列出可以连接服务器的用户信息,并且存储了用户的全局权限信息。在 mysql.user
表启用的任何权限均是全局权限,即适用于所有数据库的所有表。
如上面的查询结果所示,用户 root@localhost
的 Select_priv
字段值为 Y
,说明该用户可以查询任意数据库的任意表。
当你执行下面的授权语句后,如果 user 表中不存在 test@%
用户,那么就会往 user 表中插入一条记录,如果存在则会将 Select_priv
字段的值设为 Y
:
mysql> grant select on *.* to 'test'@'%';
db 表
mysql> select * from mysql.db\G
*************************** 1. row ***************************Host: %Db: testUser: Select_priv: YInsert_priv: YUpdate_priv: YDelete_priv: YCreate_priv: YDrop_priv: YGrant_priv: NReferences_priv: YIndex_priv: YAlter_priv: Y
Create_tmp_table_priv: YLock_tables_priv: YCreate_view_priv: YShow_view_priv: YCreate_routine_priv: YAlter_routine_priv: NExecute_priv: NEvent_priv: YTrigger_priv: Y
*************************** 2. row ***************************Host: localhostDb: performance_schemaUser: mysql.sessionSelect_priv: YInsert_priv: NUpdate_priv: NDelete_priv: NCreate_priv: NDrop_priv: NGrant_priv: NReferences_priv: NIndex_priv: NAlter_priv: N
Create_tmp_table_priv: NLock_tables_priv: NCreate_view_priv: NShow_view_priv: NCreate_routine_priv: NAlter_routine_priv: NExecute_priv: NEvent_priv: NTrigger_priv: N
mysql.db
表存储用户对数据库的权限数据。这里开启的权限适用于一个数据库中的所有表。
我们看下上面查询结果的第一条记录可得知,任何用户都可以访问数据库 test
,因为 User
字段是空。但是用户除了 Grant_priv
、Alter_routine_priv
、Execute_priv
没有权限之外,其它权限都有。
我们再看下上面查询结果的第二条记录可得知,用户 mysql.session@localhost
对数据库 performance.schema
除了拥有 Select_priv
权限之外,其它权限都没有。
当你执行下面的语句后,如果 mysql.db
表不存在用户 test@%
对数据库 test
的授权记录,那么会往 mysql.db
表插入一条记录;如果存在该用户的授权记录,则会将字段 Select_priv
的值设为 Y
:
mysql> grant select on testdb.* to 'test'@'%';
tables_priv 表
mysql> select * from tables_priv\G
*************************** 1. row ***************************Host: localhostDb: sysUser: mysql.sysTable_name: sys_configGrantor: root@localhostTimestamp: 2020-07-27 10:06:49Table_priv: Select
Column_priv:
*************************** 3. row ***************************Host: 127.0.0.1Db: qydpwUser: lwxTable_name: tf_userGrantor: root@localhostTimestamp: 2021-10-07 13:16:11Table_priv: Select,Update
Column_priv:
tables_priv
表存储着用户对某个表的权限数据,这里开启的一个权限适用于一个表的所有列。
看上面的查询结果的第一条记录可得知,用户 mysql.sys@localhost
对表 sys.sys_config
只有 Selec
权限;看上面查询结果的第二条记录可得知,用户 lwx@127.0.0.1
对表 qydpw.tf_user
有 Select
和 Update
权限。
当你执行下面的语句后,如果表中没有用户对应的记录,则会往表中插入一条记录;如果存在该用户的记录,则会往字段 Table_priv
存入一个值 Select
:
mysql> grant select on testdb.student to 'test'@'%';
columns_priv表
columns_priv
表指定列级权限。这张表保存着用户对某个表的特定列的权限数据。这里指定的权限适用于一个表的特定列。
当你执行下面的语句:
mysql> grant select(advice_id,user_id) on qydpw.tf_advice to lwx@127.0.0.1;
会往表 columns_priv
插入两条记录,表示用户 lwx@127.0.0.1
对表的 advice_id
、user_id
拥有 Select
权限:
mysql> select * from mysql.columns_priv;
+-----------+-------+------+------------+-------------+---------------------+-------------+
| Host | Db | User | Table_name | Column_name | Timestamp | Column_priv |
+-----------+-------+------+------------+-------------+---------------------+-------------+
| 127.0.0.1 | qydpw | lwx | tf_advice | advice_id | 0000-00-00 00:00:00 | Select |
| 127.0.0.1 | qydpw | lwx | tf_advice | user_id | 0000-00-00 00:00:00 | Select |
+-----------+-------+------+------------+-------------+---------------------+-------------+
2 rows in set (0.00 sec)