当数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限.
用户地址可以是localhost,也可以是ip地址、机器名字、域名.也可以用'%表示从任何地址连接.
'连接口令'不能为空,否则创建失败.
角色的概念
角色就是一组针对各种数据库权限的集合.比如,把一个角色分配给一个用户,那这个用户就拥有了这个角色包含的所有权限.一个角色可以分配给多个用户,另外一个用户也可以拥有多个角色,两者是多对多的关系.不过 MySQL 角色目前还没有提供类似于其他数据库的系统预分配的角色.比如某些数据库的 db_owner、 db_datareader 、 db_datawriter 等等.那此时此刻呢我分几个方面,来示例说明角色的使用以及相关注意事项.
示例 1:一个完整角色的授予步骤
用管理员创建三个角色:db_owner, db_datareader, db_datawriter
mysql create role db_owner,db_datareader,db_datawriter;
mysql grant all on ytt_new.* to db_owner;
Query OK, 0 rows affected (0.01 sec)
mysql grant select on ytt_new.* to db_datareader;
mysql grant insert,delete,update on ytt_new.* to db_datawriter;
分别授予这三个用户对应的角色.
-- 授权角色
mysql grant db_owner to ytt1;
-- 激活角色
mysql set default role db_owner to ytt1;
Query OK, 0 rows affected (0.00 sec)
好了,全部的角色授予的一套完整步骤.那上面有点非常规的地方是激活角色这个步骤.MySQL 角色在创建之初默认是没有激活的,也就是说创建角色,并且给一个用户特定的角色,这个用户其实并不能直接使用这个角色,除非激活了才可以.
-- 用管理员登录并且创建用户
...
-- 查看当前角色列表
mysql select current_role();
+--------------------------------------------------------+
| current_role() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| +db_datareader+@+%+,+db_datawriter+@+%+,+db_owner+@+%+ |
①. row in set (0.00 sec)
-- 简单创建一张表并且插入记录, 检索记录,完了删掉这张表
mysql use ytt_new
Database changed
mysql create table t11(id int);
mysql insert into t11 values (1);
mysql select * from t11;
+------+
| id ? |
| ? ?1 |
mysql drop table t11;
其实意思是说,用户连接到 MySQL 服务器后,可以切换当前的角色列表,比如由 db_owner 切换到 db_datareader.
mysql set role db_datareader;
+---------------------+
| current_role() ? ? ?|
| +db_datareader+@+%+ |
-- 切换后,没有权限创建表
-- 切换到 db_owner,恢复所有权限.
mysql set role db_owner;
activate_all_roles_on_login:是否在连接 MySQL 服务时自动激活角色mandatory_roles:强制所有用户默认角色
-- 用管理员连接MySQL,
-- 设置默认激活角色
mysql set global activate_all_roles_on_login=on;
-- 设置强制给所有用户赋予角色db_datareader
mysql set global mandatory_roles='db_datareader';
mysql show grants;
+-------------------------------------------+
mysql create role db_test;
-- 可以创建角色,但是不能创建用户
mysql create user ytt10;
mysql \q
Bye
-- 角色和用户都能创建
那这里其实看到 create user 包含了 create role,create user 即可以创建用户,也可以创建角色.
mysql grant select on ytt_new.* to ytt11;
+-----------------------------------+
+--------------------------------------------+
角色撤销和之前权限撤销类似.要么 revoke,要么删除角色,那这个角色会从所有拥有它的用户上移除.
-- 删除所有角色
mysql drop role db_owner,db_datareader,db_datawriter;
-- 对应的角色也从ytt1上移除掉了
mysql show grants for ytt1;
+----------------------------------+
| Grants for ytt1@% ? ? ? ? ? ? ? ?|
| GRANT USAGE ON *.* TO +ytt1+@+%+ |
grant 权限 on 数据库对象 to 用户
第一段:grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利.
grant delete on testdb.* to common_user@'%'
或者
第二段:grant 数据库开发人员,创建表、索引、视图、存储过程、函数...等权限.
grant 创建、修改、删除 MySQL 数据表结构权限.
grant 操作 MySQL 外键权限.
grant 操作 MySQL 临时表权限.
grant 操作 MySQL 索引权限.
grant 操作 MySQL 视图、查看视图源代码 权限.
grant 操作 MySQL 存储过程、函数 权限.
第三段:grant 普通 DBA 管理某个 MySQL 数据库的权限.
其中,关键字 "privileges" 可以省略.
第四段:grant 高级 DBA 管理 MySQL 中所有数据库的权限.
第五段:MySQL grant 权限,分别可以作用在多个层次上.
① grant 作用在整个 MySQL 服务器上:
这里在给一个用户授权多张表时,可以多次执行以上语句.例如:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'
第六段:查看 MySQL 用户权限
查看当前用户(自己)权限:
show grants;
查看其他 MySQL 用户权限:
第七段:撤销已经赋予给 MySQL 用户权限的权限.
revoke 跟 grant 的语法差不多,只需要把关键字 "to" 换成 "from" 即可:
第八段:MySQL grant、revoke 用户权限注意事项
① grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效.
这个特性一般用不到.实际中,数据库权限最好由 DBA 来统一管理.
授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限.在user表启用的任何权限均是全局权限,并适用于所有数据库.例如,如果你启用了DELETE权限,今天这一节列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑.
db表
db表列出数据库,而用户有权限访问它们.今天这一节指定的权限适用于一个数据库中的所有表.
host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些.这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它.
tables_priv表
tables_priv表指定表级权限,今天这一节指定的一个权限适用于一个表的所有列.
columns_priv表
columns_priv表指定列级权限.这里指定的权限适用于一个表的特定列.
注:
对于GRANT USAGE ON,查看手册有如下介绍和实例:
mysql GRANT USAGE ON *.* TO 'zhangkh'@'localhost';
一个账户有用户名zhangkh,没有密码.该账户只用于从本机连接.未授予权限.通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限.它可以将所有全局权限设为'N'.假定你将在以后将具体权限授予该账户.
①.、创建新用户
通过root用户登录之后创建
flush privileges ;//mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问,还有一种方法,就是重新启动mysql服务器,来使新设置生效
REVOKE select,insert ON what FROM testuser//取消用户testuser的【查询\插入】操作权限 ;
这里只说使用GRANT语句的方法,当然还有直接修改MySQL表的方法,不过很麻烦,用的人不多~
前提是有MySQL root权限
例子:建立另一个超级用户(所有权限)的方法
*.* 中第一个星星是数据库名(*为所有数据库),第二个星星是表名(*为前面数据库下的所有表)
ALL 是指全部语句的操作权限(经常看到虚拟主机等的用户没有DROP权限,就是这里做了手脚)
语法大概就是这样吧.
MySQL命令行能否实现新建用户呢?答案无疑是肯定的.而且在使用使用MySQL命令行新建用户后,还可以为用户授予权限.
首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的.
注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.
用户:phplamp
用户数据库:phplampDB
①MySQL命令行新建用户
//登录MYSQL
@mysql -u root -p
@密码
//创建用户
//刷新系统权限表
mysqlflush privileges;
//退出后登录一下
mysqlexit;
@mysql -u phplamp -p
@输入密码
mysql登录成功
//登录MYSQL(有ROOT权限).我里我以ROOT身份登录.
//首先为用户创建一个数据库(phplampDB)
mysqlcreate database phplampDB;
//授权phplamp用户拥有phplamp数据库的所有权限
mysql其它操作
//如果想指定部分权限给一用户,可以这样来写:
//刷新系统权限表.
用户地址可以是localhost,也可以是ip地址、机器名字、域名.也可以用'%'表示从任何地址连接.
例如: