Mysql教程

15.1 权限表

安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库下面存储的都是权限表。用户登录以后,MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表中最重要的是user表、db表和host表。除此之外,还有tables_priv 表、columns_priv表和proc_priv表等。本节将为读者介绍这些表的内容。

15.1.1 user表

user表是MySQL中最重要的一个权限表。读者可以使用DESC语句来查看user表的基本结构。user打表有39个字段。这些字段大致可以分为4类,分别是用户列、权限列、安全列和资源控制列。本小节将为读者介绍这些字段的含义。

1. 用户列

user表的用户列包括Host、User、Password,分别表示主机名、用户名和密码。用户登录时,首先要判断的就是这3个字段。如果这3个字段同时匹配,MySQL数据库系统才会允许其登录。而且,创建新用户时,也是设置这3个字段的值。修改用户密码时,实际就是修改user表的password字段的值。因此,这3个字段决定了用户能否登录。

2. 权限列

user表的权限列包括Select_priv、Insert_priv等以priv结尾的字段。这些字段决定了用户的权限。这其中包括查询权限、修改权限等普通权限,还包括了关闭服务的权限、超级 权限和加载用户等高级管理权限。普通权限用于操作数据库。高级管理权限用于对数据库进行管理。

这些字段的值只有Y和N。Y表示该权限可以用到所有数据库上;N表示该权限不能用到所有数据库上。从安全角度考虑,这些字段的默认值都为N。可以使用GRANT语句为用户赋予一些权限,也可以通过UPDATE语句更新user表的方式来设置权限。

说明:权限列中有很多权限字段需要特别注意。Grant_priv字段表示是否拥有GRANT权限;Shutdown_priv字段表示是否拥有停止MySQL服务的权限;Super_priv 字段表示是否拥有超级权限;Execute_priv字段表示是否拥有EXECUTE权限, 拥有EXECUTE权限可以执行存储过程和函数。

3. 安全列

user表的安全列只有4个字段,分别是ssl_type、ssl_cipher、x509_issuer和x509_subject。ssl用于加密;x509标准可以用来标识用户。通常标准的发行版不支持ssl,读者可以使用SHOW VARIABLES LIKE 'have_openssl'语句来查看是否具有ssl功能。如果have_openssl的取值为DISABLED,那么则没有支持ssl加密功能。

4. 资源控制列

user表的4个资源控制列是max__questions、max_updates、max_connections和max_user_connections. max_questions和max_updates分别规定每小时可以允许执行多少次查询和更新;max_connections规定每小时可以建立多少连接;max_user_connections规定单个用户可以同时具有的连接数。这些字段的默认值为0,表示没有限制。

15.1.2 db表和host表

db表和1host表也是MySQL数据库中非常重要的权限表。db表中存储了某个用户对一个数据库的权限。db表比较常用,而host表很少会用到。读者可以使用DESC语句来查看这两个表的基本结构。这两个表的表结构差不多。db表和host表的字段大致可以分为两类,分别为用户列和权限列。

1.用户列

db表的用户列有3个字段,分别是Host、Db和User。这3个字段分别表示主机名、数据库名和用户名。host表的用户列有两个字段,分别是Host和Db这两个字段分别表示主机名和数据库名。

host表是db表的扩展。如果db表中找不到Host字段的值,就需要到Host表中去寻找。但是host表很少用到,通常db表的设置以及满足要求了。

2.权限列

db表和host表的权限列几乎一样,只是db表中多了一个Create_routine_priv字段和Alter_routine_priv字段。这两个字段决定用户是否具有创建和修改存储过程的权限。

user表中的权限是针对所有数据库。如果user表中的Select_priv字段取值为Y,那么该用户可以查询所有数据库中的表;如果为某个用户只设置了查询test表的权限,那么user 表的Select_priv字段的取值为N.而这个SELECT权限则记录在db表中。db表中Select_priv字段的取值将会是Y。由此可知,用户先根据db表的内容获取权限,然后再根据db表的内容获取权限。

15.1.3 tables_priv表和 columns_priv 表

tables_priv表可以对单个表进行权限设置。columns_priv表可以对单个数据列进行权限设置。读者可以使用DESC语句来查看这两个表的基本结构。本小节将介绍这两个表的内容。

tables_priv 表包含8个字段,分别是 Host、Db、User、Table name、Table_priv、Column_priv、Timestamp和Grantor。前4个字段分别表示主机名、数据库名、用户名和表名。Table_priv表不对表进行操作的权限。这些权限包括select、Insert、Update、Delete、 Create、Drop、Grant、References、Index 和 Alter。Column_priv 表示对表中的数据列进行操作的权限。这些权限包括Select、Insert、Update和References。Timestamp表示修改权限的时间。Grantor表示权限是谁设置的。

Column_priv表包括7个字段,分别是Host、Db、User、Table_name、Column_ name,Column_priv和Timestamp。与tables_priv表不同的是,这里多出了 Column_name字段, 其表示可以对哪些数据列进行操作。

技巧:MySQL中权限分配是按照user表、db表、tables_priv表和columns_priv表的顺序进行分配的。数据库系统中,先判断user表中的值是否为Y。如果user表中 的值是Y,就不需要检查后面的表。如果user表的为N,则依次检查db表、 tables_priv 表和 columns_priv 表。

15.1.4 procs_priv表

procs_priv表可以对存储过程和存储函数进行权限设置。读者可以使用DESC语句来查看procs_priv表的基本结构。本小节将为读者介绍procs_priv表中各字段的含义。

procs_priv表包含8个字段,分别是此Host、Db、User、Routine name、Routine_type、 Proc_priv. Timestamp和Grantor。前3个字段分别表示主机名、数据库名和用户名。Routine_name字段表示存储过程或函数的名称。Routine_type字段表示类型。该字段有两个取值,分别是FUNCTION和PROCEDURE。FUNCTION表示这是一个存储函数; PROCEDURE表示这是一个存储过程,procs_priv字段表示拥有的权限。权限分为3类,分别是Execute,Alter Rountine和Grant。Timeatamp字段存储更新的时间;Grantor字段存储权限是谁设置的。


关注微信获取最新动态