重点:权限表的关系、授予、撤销权限的关键词
- MySQL权限表
MySQL通过MySQL权限表来实现控制用户对数据库的访问。
- 常用到的表有:
user / db / tables_priv / columns_priv / procs_priv
- 原则
- 通过身份认证后,按顺序得到权限:user>>db >> table_priv >>colums_priv
- 权限依次递减,全局权限覆盖局部权限
MySQL 中权限的分配是按照 user 表、db 表tables_priv 表和 columns-priv 表的顺序进行分配的。在数据库系统中,先判断 user 表中的值是否为 ,如果user中的值是,就不需要检查后面的表了;如果 user 表中的值为n,则依次检查 db 表、tables_priv 表和 columns_priv 表。
- user表
user表中权限针对所有数据库。
- 用户列
host、user和password(authentication_string)
- 权限列
以priv结尾的字段,决定用户权限
字段的值只能y或n,表示有权限和无权限;默认值是n,可使用grant语句赋予权限
- 安全列
- ssl(ssl_type和ssl_cipher)用于加密
- x509标准(x509_issuer和x509_subject)用于标识用户
- plugin用于验证用户插件,如为空MySQL使用默认验证机制
- 资源控制列:用来限制用户使用的资源
- max_questions:用户每小时允许查询操作次数
- max_updates:用户每小时允许更新操作次数
- max_connections:用户每小时允许连接操作次数
- max_user_connections:单用户可同时的连接次数
- 这些字段的默认值为0,表示没有限制
- db表
db表中的权限针对确定数据库
存储用户对某数据库的操作权限,决定用户能从哪个主机存取哪个数据库;
不受grant和revoke语句的影响。
- 用户列
host、db、user
- 权限列
create_routine_priv和alter_routine_priv:创建和修改存储过程。
- 如user表中的select_priv取值为y,该用户可查询所有数据库中的表;
- 如为某个用户只查询demo权限,user表select_priv取值为n,db表select_priv取值是y。
- tables_priv表
对单表的权限设置,指定的权限适用于确定表的所有列。
说明
- grantor:修改该记录的用户。
- timestamp:修改该记录的时间。
- table_priv:对表操作的权限,包括select、insert、update、delete、create、drop、grant、references、index和alter。
- column_priv:对表中列操作的权限,包括select、insert、update和references。
- columns_priv表
对表中某一列操作的权限。
column_name用来指定对哪些数据列具有操作权限。
column_priv:包括select、insert、update和references。
- procs_priv表
对存储过程和函数权限设置。
说明
- routine_name:存储过程或存储函数名称。
- routine_type:表示存储过程或存储函数的类型,function和procedure。
- grantor:存储插入或修改该记录的用户。
- proc_priv:拥有的权限,包括execute、alter routine、grant这3种。
- timestamp:存储记录更新时间。
- 账户权限管理
- 授予权限(grant)
- grant要求提供以下信息:①要授予的权限②被授予访问权限的数据库或表③用户名。
语法格式:
grant priv_type[(column_list)] [,priv_type[(column_list)]]…
on [object_type] priv_level
to user_specification[,user_specification]…
[with with_option…]
- 说明
- priv_type:权限的名称,如select、update、delete;
- column_list:指定权限要授予该表中哪些具体的列;
- on子句:指定权限授予的对象和级别,给出要授权的数据库名或表名;
- object_type:于指定权限授予的对象类型,用关键字table、function和procedure;
- priv_level:指定权限级别。可以授予的权限有如下几组:①列权限②表权限③数据库权限④用户权限。对应地,在grant语句中可用于指定权限级别的值有这样几类格式:
*→表示当前数据库中的所有表。
*.*→表示所有数据库中的所有表。
db_name.* →表示某个数据库中的所有表;
db_name.tbl_name→表示某个数据库中的某个表或视图;
db_name.routine_name→表示某数据库中的某个存储过程或函数。
- to子句:用来设定用户的口令,以及指定被授予权限的用户user。
若to子句中给系统存在的用户指定口令,则实现改密码;
如权限给一个不存在的用户, mysql会自动创建用户;
- user_specification:to子句中的具体描述部分,其与create user语句中的user_specification部分一样。
- with子句:grant语句的最后可以使用with子句,为可选项,其用于实现权限的转移或限制
- 撤销权限(revoke)
- 用于回收某些特定的权限
revoke priv_type[(column_list)] [,priv_type[(column_list)]]…
on[object_type]priv_level from user[,user]…
- 用于回收特定用户的所有权限
revoke all privileges,grant option
from user[,user]…
- 说明
- revoke和grant用法相似,但作用相反
- 使用revoke语句的用户须拥有mysql数据库全局create user或update权限