文章目录
安装MariaDB会自动安装一个名为MySQL的数据库,MySQL数据库下面存储的都是权限表。用户登录以后,MariaDB数据库系统会根据这些权限表的内容为每个用户赋予相应权限,有几个权限表非常重要。
user表
user表是MariaDB数据库最重要的一个权限表。查看表的基本结构可以看到,user表有39个字段,这些字段大致分为4类,分别是用户列、权限列、安全列和资源控制列。
用户列
用户列包括
| Host | char(60) | NO | PRI | | |
| User | char(80) | NO | PRI | | |
| Password | char(41) | NO | | | |
用户登录时首先判断这三个字段,只有三个字段同时匹配,MariaDB数据库才会允许登录。
权限列
权限列包含所有以_priv结尾的字段,这些字段决定用户的权限,既包括查询权限、修改权限等普通权限,也包括关闭服务的权限、超级权限。普通权限用于操作数据库,高级管理权限用于对数据库进行管理。
这些字段的值只有Y和N。Y表示该权限可以用于所有数据库,N表示该权限不能用于所有数据库。
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
有些权限字段应该特别注意:
- Grant_priv字段表示是否拥有GRANT权限
- Shutdown_priv字段表示是否拥有停止MariaDB服务的权限
- Super_priv字段表示是否拥有超级权限
- Execute_priv字段表示是否拥有EXECUTE权限,拥有EXECUTE权限可以执行存储过程和函数
安全列
user表的安全列有4个字段:
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
ssl用于加密;x509标准可以用来识别用户。
我们可以查看是否具有ssl功能:
show variables like 'have_openssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
+---------------+-------+
资源控制列
user表的资源控制列有:
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) | NO | | 0 | |
- max_questions:每小时可以允许执行多少次查询
- max_updates:每小时可以允许执行多少次更新
- max_connections:每小时可以建立多少连接
- max_user_connections:单个用户可以同时具有的连接数
这些字段的默认值是0,表示没有限制。
db表和host表
db表和host表也是MariaDB数据库中非常重要的权限表,db表和host表存储了数据库用户对一个数据库的权限,一般我们经常用db表而很少用host表。db表和host表的字段大致能分成两列,用户列和权限列。
host表是db表的扩展,如果在db表中找不到host字段的值,就需要去host表中找,但是一般不会用到host表,有db表就足够了。
用户列
db表的用户列有三个字段:
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(80) | NO | PRI | | |
这三个字段分别表示主机名、数据库名和用户名。
host表的用户列有两个字段:
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
这两个字段分别表示主机名和数据库名。
权限列
db表和host表的权限列几乎一样,只是多了Create_routine_priv和Alter_routine_priv两个字段,这两个字段决定用户是否具有创建和修改存储过程的权限。
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
user表中的权限针对所有数据库,db表和host表中的权限对其进行补充。如果某个用户只有查询test数据库的权限,nm在user表中Select_priv字段取值为N,而这个权限会记录在db表中。
tables_priv表和columns_priv表
tables_priv表可以对单个表进行权限设置,columns_priv表可以对单个数据列进行权限设置。
tables_priv表
tables_priv表包含8个字段:
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(80) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | char(141) | NO | MUL | | |
| Timestamp | timestamp | NO | | current_timestamp() | on update current_timestamp() |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
前4个字段分别表示主机名、数据库名、用户名和表名。Table_priv表示对表进行操作的权限,这些权限包括Select、Insert、Update、Delete、Create、Drop、Grant、References、Index、Alter、Create View、Show view和Trigger。Column_priv表示对表中的数据列进行操作的权限,这些权限包括Select、Insert、Update和References。Timestamp表示修改权限的时间。Grantor表示权限是谁设置的。
columns_priv表
columns_priv表包括7个字段:
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(80) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | current_timestamp() | on update current_timestamp() |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
这里比tables_priv表多了Column_name,表示可以对那些数据列进行操作、
MariaDB中权限分配是按照user表、db表、tables_priv表和columns_priv表的顺序进行的,数据库系统先判断user表中值是否为Y,如果是Y就不再检查后面的表,如果是N就继续检查后面的表
procs_priv表
procs_priv表可以对存储过程和存储函数进行权限设置。
procs_priv表包括8个字段:
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(80) | NO | PRI | | |
| Routine_name | char(64) | NO | PRI | | |
| Routine_type | enum('FUNCTION','PROCEDURE') | NO | PRI | NULL | |
| Grantor | char(141) | NO | MUL | | |
| Proc_priv | set('Execute','Alter Routine','Grant') | NO | | | |
| Timestamp | timestamp | NO | | current_timestamp() | on update current_timestamp() |
前三个字段表示主机名、数据库名和用户名。Routine_name表示存储过程或函数的名称。Routine_type表示类型,这一字段的两个值,FUNCTION表示这是一个存储函数,PROCEDURE表示这是一个存储过程。Proc_priv表示拥有的权限。Timestamp存储更新时间。Grantor存储权限是谁设置的。