目录
一、用户账号管理
1.概念
MySQL的用户账号及相关信息都存储在一个名为mysql的数据库中,这个数据库里有一个名为user的数据表,包含了所有用户账号,并且它用一个名为user的列存储用户的登录名
可以观察到user数据表中有一个名为root的用户,这个用户是在成功安装MySQL服务器后由系统创建的,并且赋予了操作和管理MySQL的所有权限
在对MySQL的日常管理中,为了避免用户恶意冒名使用root账号操纵数据库,所以要尽可能不用root账号登录系统,以此确保数据的安全性
2.创建用户账号
格式:
CREATE USER 用户名@主机名
IDENTIFIED BY [PASSWORD] 'password' | [IDENTIFIED WITH 认证插件名称 AS ];
- 如果在创建用户账号过程中只给出用户名,而没指定主机名,则主机名会被默认为‘%‘,表示一组主机
- IDENTIFIED BY:指定用户账号对应的口令[可选项]
- PASSWORD:散列口令[可选项]
- 用明文设置口令时,省略PASSWORD关键字
- 不想用明文设置口令时,且知道该明文通过PASSWORD()函数返回的散列值时,可以在此口令设置语句中指定此散列值,记得在前面带上关键字PASSWORD
- password:指定用户账号的口令,给定的口令值只能由字母和数字组成的明文,也可通过PASSWORD()函数得到的散列值
- IDENTIFIED WITH:指定验证用户账号的认证插件
Example:
- 明文设置口令:
- 非明文设置口令
获取明文"456"所对应的通过PASSWORD()函数返回的散列值
注意事项:
要使用CREATE USER语句,必须拥有MySQL中mysql数据库的INSERT权限或全局CREATE USER权限
使用CREATE USER语句创建一个用户账号后,会在系统自身的mysql数据库的user表中添加一条新纪录。若创建的账号已经存在,则语句执行出错
如果两个用户具有相同的用户名和不同的主机名,MySQL会将它们视为不同的用户,并允许分配不同的权限集合
如果在CREATE USER语句中没有为用户指定口令,那么该用户可以不使用口令登录系统
新创建用户所拥有的权限很少
3.删除用户账号
格式:
DROP USER 用户名@主机名[去掉单引号]
- 可用于删除一个或多个MySQL账户,并消除其权限
- 必须拥有MySQL中mysql数据库的DELETE权限或全局CREATE USER权限
- DROP USER语句中,如果没有指定主机名,则默认主机名为%
- 删除用户并不会影响到它们之前所创建的表、索引和其他数据库对象
Example:
4.修改用户账号
格式:
REANAME USER 旧用户账号 TO 新用户账号[,...]
- RENAME USER语句用于对原有MySQL账户进行重命名
- 必须拥有MySQL中mysql数据库的UPDATE权限或全局的CREATE USER权限
- 如果要修改的旧账户不存在或新账户已存在,则语句执行出错
Example:
5.修改用户口令
格式:
SET PASSWORD [FOR 用户账号] = PASSWORD('password') | '散列值'
- FOR子句:指定要修改的用户账号[可选项]
- PASSWORD('password'):表示使用PASSWORD函数设置新口令(新口令需传递给PASSWORD()中加密)
- '散列值':已经被函数PASSWORD()加密的口令值
- SET PASSWORD语句
- 若不加FOR子句,表示修改当前用户的口令
- 若加上FOR子句,表示修改指定用户账号的口令
Example:
- 自行测试
二、账户权限管理
1.查看权限
创建用户账号后,需要为用户分配适当的访问权限,因为新创建的用户是没有任何访问权限的,只能登录MySQL服务器,其余的啥也干不了
可用下述命令查看新建用户的授权表:
由输出结果可知,新用户仅有一个USAGE ON *.*,表示该用户对任何数据库和数据表都没有权限
2.授予权限
格式:
GRANT 权限名称 [列名称] ON 对象类型 [权限级别] TO '用户账号' [WITH option]
权限名称:如SELECT、UPDATE、DELETE等操作
列名称:指定权限要授予给表中哪些具体的列[可选项]
对象类型: TABLE | FUNCTION | PROCEDURE
权限级别:
- 列权限:和表的一个具体列相关
- 表权限:和一个具体表的所有数据相关
- 数据库权限:和一个具体数据库的所有表相关
- 用户权限:和MySQL中所有的数据库相关
在GRANT语句中可用于指定权限级别的值:
- *:表示当前数据库的所有表
- *.*:表示所有数据库的所有表
- 数据库名.*:表示指定数据库的所有表
- 数据库名.表名/视图名:表示某个数据库的某个表或视图
- 表名/视图名:表示某个表或视图
- 数据库名.存储过程名/函数名:表示某个数据库的某个存储过程或函数
TO子句:用来设定用户的口令,以及指定被授予权限的用户
- 若给系统中存在的用户指定口令,则新密码会覆盖原密码
- 若将权限授予给一个不存在的用户,MySQL会自动执行一条CREATE USER语句创建这个用户,但同时必须为该用户指定口令
用户账号:用户名@主机名
WITH子句:实现权限的转移或限制[可选项]
Example:
- 授予lisi对tb_student表中的studentNo、studentName、classNo字段的DELETE、INSERT权限
- 授予权限后,用户可以使用DELETE、INSERT语句操纵表的数据,其余的操作暂时执行不了
-
用lisi账号登录MySQL服务器执行查询操作
3.转移权限
- 将WITH子句指定为WITH CHECK OPTION,则表示TO子句中所指定的所有用户都具有把自己所拥有的权限授予给他人的权利,而无论其它用户是够拥有该权限
格式:
GRANT 权限名称 [列名称] ON 对象类型 TO '用户账号' WITH GRANT OPTION;
Example:
4.限制权限
- WITH关键字后面跟的是MAX_QUERIES_PER_HOUR count、MAX_UPDATE_PER_HOUR count、MAX_CONNECTIONS_PER_HOUR count 或 MAX_USER_CONNECTIONS count 中的某一项,则该GRANT语句可用于限制权限
- MAX_QUERIES_PER_HOUR count:表示限制每小时可以查询数据库的次数
- MAX_UPDATE_PER_HOUR count:表示限制每小时可以修改数据库的次数
- MAX_CONNECTIONS_PER_HOUR count:表示限制每小时可以连接数据库的次数
- MAX_USER_CONNECTIONS count:表示限制同时连接MySQL的最大用户数
格式:
GRANT 权限名称 ON 表名/存储过程... TO 用户名 WITH 权限限制 count;
Example:
5.撤销权限
- 当要撤销一个用户的权限,但又不希望将该用户从系统中删除时,可以使用REVOKE语句来实现
格式:
①
REVOKE 权限名 [列名 ,权限名 列名...] ON 对象 FROM 用户账号
②
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用户账号
- 第一种语法格式:回收某些特定的权限
- 第二种语法格式:回收特定用户的所有权限
- 要使用REVOKE语句,必须具有mysql数据库的全局CREATE USER权限或UPDATE权限
Example:
①:
②:
③:用户lisi只有登录的权限