Mysql 用户关于数据库,表,列权限结构说明
用户权限引用
在前边我们讲解了 mysql.user 表中权限相关字段信息;但我们日常数据库使用中会涉及到使用部分权限的情况;
比如存在对账户分级需求时。
- 系统管理员账户:root 。拥有系统所有权限。
- 业务系统一级账户:拥有业务系统数据库中所有操作权限。
- 业务系统二级账户:拥有业务系统存储过程,视图,函数等创建调用权限。
- 业务系统三级账户:拥有业务系统表数据操作权限。
- 业务系统四级账户:仅允许查询业务系统表数据。
- 业务系统五级账户:仅允许查询业务系统中部分表的部分字段。
这个时候仅靠user表是无法满足要求的;因为user表是适用于账户全局权限控制的。此时权限控制会引入另外三张表:
mysql.db
mysql.tables_priv
mysql.columns_priv
- mysql.db : 数据库级别权限
- mysql.tables_priv :表级别权限
- mysql.columns_priv : 列级别权限
在介绍这三张表之前我们先回顾一下用户创建 与 用户授权 语句;
用户表权限与授权语句关系
创建用户
创建用户最小条件:用户名,对应HOST,用户密码;满足这三项的时候就可以直接创建用户 ,其他用户属性字段在不指定的情况下;系统会使用默认值;
创建一个名为:mysql5,HOST为所有地址:‘%’,用户密码为:0110#Wh
CREATE user 'mysql5'@'%' IDENTIFIED by '0110#Wh'
此时创建的用户‘mysql5’ 虽然对用户连服务器的地址没有限制;但是没有任何权限的。
在mysql.user 表的体现:
对用户表授权
现在需要对用户 mysql5 授予全局的select权限;
GRANT SELECT ON *.* TO 'mysql5'@'%';
GRANT 是授权语句;SELECT 是授权类型;ON 关键字;*.* 所有数据库的所有表,第一个 ‘’ 代表所有数据库,第二个 ‘’
代表库下的所有表;库与表使用‘.’ 分隔;‘mysql5’@‘%’ 表示指定的用户 (用户权限识别对象是用户名与HOST共同组成) 。 该语句执行完成后 mysql.user 表中用户的查询权限值已经由 N 变成了 Y:
现在用户 mysql5 已经可以打开系统的所有库中的所有表(包括mysql系统库);
其原因就在于我们给 mysql5 账户设置权限的时候使用了 *.* ; 当权限范围指示为 *.* 的时候,表示此时设置的权限是全局的;其作用范围仅与账户有关;不涉及到限制库与表。
DB表
接下来我们来看看mysql.db表的权限;
首先清理用户 mysql5@% 的所有权限
REVOKE ALL ON *.* FROM 'mysql5'@'%';
此时用户权限已经回到刚创建时的初始状态;
要求:给 mysql5@% 用户授予order 库的所有 select 权限;