一、授权命令
语法格式:
[(none)]>grant 权限 on 数据库名.表名 to 用户名@'HOST' identified by "密码"
实例演示:
1)给本地用户授权数据库world的所有权限
[(none)]>grant all on world.* to lisi@'localhost';
2)允许远程用户通过任意主机连接数据库,并拥有world的所有权限
[(none)]>grant all on world.* to zhangsan@'%';
3)允许远程用户通过跳板机192.168.31.1访问数据库,并拥有world的所有权限
[(none)]>grant all on world.* to zhangsan@'192.168.31.1';
4)授权zhangsan对数据库world仅具有查询权限
[(none)]>grant slect on world.* to zhangsan@'localhost';
5)授权zhangsan对数据库world仅具有查询、删除、插入、更改的权限
[(none)]>grant slect,delete,insert,update on world.* to zhangsan@'localhost';
6)授予查询world数据库的权限给多个用户
[(none)]>grant slect on world.* to zhangsan@'localhost',lisi@'localhost';
7)只对某张表的某个字段授权
[(none)]>grant select (name,age) on zsythink.students to zhangsan@'localhost';
8)如果world数据库中有一张表的名称为test,同时,world数据库中有一个函数也叫test,那么,此时如果管理员只想将test函数的权限授予zhangsan用户,而不是想将表的权限授予zhangsan用户,该怎么办呢?我们可以通过function关键字指明被操作的对象为函数,而不是表,示例如下:
[(none)]>grant execute on function world.test to zhangsan@'192.168.31.%';
9)上述语句表示授权zhangsan用户对world数据库中test函数拥有执行权限。同理,也可以使用procedure关键字,指明被操作的对象是存储过程,比如,如下语句表示授权zhangsan用户对world数据库中的test存储过程拥有执行权限。
[(none)]>grant execute on procedure world.test to zhangsan@'192.168.31.%';
小结:使用function关键字和procedure关键字可以对函数或存储过程授权,同理,使用view关键字即可对视图进行授权。
10)当一个用户被创建时,mysql会自动授予其usage权限。usage权限只能用于登录数据库,不能执行其他操作。
如果用户有可能会跨越不安全的网络连接到数据库,我们可以强制用户使用ssl建立会话,命令如下:
[(none)]>grant usage on *.* to 'zhangsan'@'111.111.111.111' require ssl;
取消上述的ssl连接显示:
[(none)]>grant usage on *.* to 'zhangsan'@'111.111.111.111' equire none;
11)假设,root用户授权了zhangsan用户某些权限,那么zhangsan用户是否能将已经拥有的权限授予别的用户?这取决于zsy用户是否拥有 grant 选项。
如果在授权zhangsan用户时,搭配了grant选项,则zhangsan用户有权将已拥有的权限授予其他用户,但是这样做比较危险,一般情况下应由管理员同一授权,但是此处用于演示,给出如下示例。
[(none)]>grant select on world.* to zhangsan@'192.168.31.%' with grant option;
该命令表示zhangsan用户被授予了world数据库的select的权限,同时zhangsan用户也能将此权限授予其他用户,而且zhangsan用户也能在授予其他用户select权限时使用with grant option,所以这很危险,请勿随意使用此选项。
12)除了上面提到的grant option,管理员还可以通过如下选项对用户进行一些其他的限制
MAX_QUERIES_PER_HOUR:限制用户每小时执行的查询语句数量;
MAX_UPDATES_PER_HOUR:限制用户每小时执行的更新语句数量;
MAX_CONNECTIONS_PER_HOUR:限制用户每小时连接数据库的次数;
MAX_USER_CONNECTIONS:限制用户使用当前账号同时连接服务器的连接数量;
上述各限制选项的示例如下。
grant select on *.* to zhangsan@'192.168.31.%' identified by '123456' with max_queries_per_hour 20;
grant select on *.* to zhangsan@'192.168.31.%' identified by '123456' with max_updates_per_hour 10;
grant select on *.* to zhangsan@'192.168.31.%' identified by '123456' with max_connections_per_hour 15;
grant select on *.* to zhangsan@'192.168.31.%' identified by '123456' with max_user_connections 2;
如果将上述限制对应的数字改为0,则表示不限制。
二、查看授权
查看授权可以从两个角度查看:
-
从用户的角度查看授权,表示查看对应用户都能操作哪些数据库;
语法格式:[(none)]>show grants for user@host;
实例演示:
1)查看zhangsan@localhost这个用户对那些库有哪些权限 [(none)]>show grants for zhangsan@localhost; +----------------------------------------------+ | Grants for zhangsan@localhost | +----------------------------------------------+ | GRANT USAGE ON *.* TO 'zhangsan'@'localhost' | +----------------------------------------------+ 1 row in set (0.00 sec)
可以看到zhangsan@localhost用户对所有库,所有表都拥有 USAGE 权限;
-
从数据库的角度查看授权,表示查看指定数据库都对哪些用户开放了哪些权限;
语法格式:[(none)]>select * from mysql.db where Db="你要查看的数据库"
实例演示:
[(none)]>select * from mysql.db where Db='world'\G; *************************** 1. row *************************** Host: localhost Db: world User: lisi Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N References_priv: Y Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Create_view_priv: Y Show_view_priv: Y Create_routine_priv: Y Alter_routine_priv: Y Execute_priv: Y Event_priv: Y Trigger_priv: Y 1 row in set (0.00 sec) ERROR: No query specified
三、删除授权
语法格式:
[(none)]>revoke "要移除的权限" on 数据库.表 from 用户@host;
实例演示:
1)删除lisi@localhost用户对world数据库的所有操作权限
[(none)]>revoke all on world.* from lisi@localhost;
2)删除lisi@localhost用户对test数据库的update权限
[(none)]>revoke update on test.* from lisi@localhost;