5.2.2 授予权限
用户管理的核心就是权限分配,MySQL数据库中授予权限有专用命令GRANT,它不仅能够授予权限,甚至还能创建用户(前面小节中演示过)。严谨些描述,它能在创建用户的同时授予权限,看起来授权操作倒像是顺带的功能一样。
GRANT命令的语法看起来可是相当复杂的呐:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [IDENTIFIED BY [PASSWORD] 'password'] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
除了priv_type,其它几个加粗的几个子项详细语法如下:
l object_type:
TABLE
| FUNCTION
| PROCEDURE
l priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
l ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
l with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
貌似漏掉了priv_type选项,放心我没忘,最重要的priv_type需要放在最显著的地方解说,它看起来最简单,但可选项也最多,用于指定可授予(或收回)的权限类型,对此官方文档中,针对可授予的权限,专门列了个表罗列的很清晰:
权限类型 | 简要说明 |
ALL [PRIVILEGES] | 授予除 GRANT OPTION 外的所有权限 |
ALTER | 允许执行ALTER TABLE操作 |
ALTER ROUTINE | 允许修改或删除存储过程和函数 |
CREATE | 允许创建数据库和创建表对象 |
CREATE ROUTINE | 允许创建存储过程和函数 |
CREATE TABLESPACE | 允许创建/修改或删除表空间及日志文件组 |
CREATE TEMPORARY TABLES | 允许执行CREATE TEMPORARY TABLE语句创建临时表 |
CREATE USER | 允许执行CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES语句 |
CREATE VIEW | 允许创建/修改视图 |
DELETE | 允许执行DELETE语句 |
DROP | 允许删除数据库/表或视图 |
EVENT | 允许使用Event对象 |
EXECUTE | 允许用户执行存储程序 |
FILE | 允许用户读写文件 |
GRANT OPTION | 允许将授予的权限再由该用户授予其它用户 |
INDEX | 允许创建/删除索引 |
INSERT | 允许执行INSERT语句 |
LOCK TABLES | 允许对拥有SELECT权限的表对象执行LOCK TABLES |
PROCESS | 允许用户执行SHOW PROCESSLIST命令查看当前所有连接 |
PROXY | 允许使用PROXY |
REFERENCES | 尚未应用 |
RELOAD | 允许执行FLUSH操作 |
REPLICATION CLIENT | 允许用户连接复制环境中的Master/Slave |
REPLICATION SLAVE | 允许复制环境的slave端从master端读取数据 |
SELECT | 允许执行SELECT语句 |
SHOW DATABASES | 允许执行SHOW DATABASES语句显示所有数据库 |
SHOW VIEW | 允许执行SHOW CREATE VIEW查看视图定义 |
SHUTDOWN | 允许通过mysqladmin命令关闭数据库 |
SUPER | 允许执行管理操作,比如CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL等语句 |
TRIGGER | 允许创建或删除触发器 |
UPDATE | 允许执行UPDATE操作 |
USAGE | 意指没有权限(no privileges) |
表5-2 MySQL用户权限
这个表罗列了所有可授予给用户的权限,不管针对什么用户,授予哪个对象,什么粒度的权限,都是从上面列表中的关键字中选择。
以上几段加一块基本上就是grant语句的语法,看起来呢是复杂了一点点,不过不懂也没关系,再说就算懂了也不一定记的住,就算记住了也不一定真能理解它在说什么,就像现在人人都知道要先感谢国家,你懂的,人人都明白那不过就是说说(不过海外各种二代及二代亲戚们说这话时应该是真心的),关键时刻得动真格的,得会用才行,三思争取后面多弄几个例子,让大家伙都搞明白这个事儿。
下面先举个最简单的例子帮助大家理解,我们要授予jss_grant@'192.168.30.203'用户查询mysql.user表的权限,执行语句如下:
(system@localhost) [(none)]> grant select on mysql.user to jss_grant@'192.168.30.203';
Query OK, 0 rows affected (0.00 sec)
其中"select"对应的就是priv_type中的权限,"mysql.user"对应priv_level中的db_name.tbl_name,这是一个最简单的示例,当然啦,不使用grant语句,而通过insert,update方式修改字典表也是靠谱的!
话说MySQL数据库中有些权限的设计也很有意思,值得说道几句。
首先是关于CREATE /DROP这类权限,这是个很有意思的设定,拿CREATE权限来说,如果一个用户拥有了建库的权限,那么它也一定能创建表(但不能创建视图),此处的粒度设计没有那么细,MySQL数据库并没有将建库和建表设计成两种权限,而是合二为一。DROP权限也是类似的设计,不过与CREATE权限有所不同的是,DROP权限也能删除视图对象。其实其它数据库中也有类似的设定,比如对于Oracle数据库环境,某个用户拥有创建对象的权限的话,那么它就一定拥有删除这个对象的权限。在Oracle看来,能创建就应该能删除,这两者是一体的,无法单独剥离。就我个人看来,Oracle的设定明显更为老道,而且符合逻辑,MySQL在这方面的设计还是显的规划有些不够清晰。
其次关于ALL [PRIVILEGES]和GRANT OPTION两种权限,这是两种比较特殊的权限,甚至在授予或收回这两类权限时都不能与其它权限同时操作,并且这两个权限并不像它们名字显示的那样是"全部"的权限,后面的示例中会演示这一点。
最后关于USAGE权限,按照上表的描述中所示,这个权限的功能就是"没有权限",但其实它不是完全没有权限,至少它还有一项权限,就是"登录权限",对于使用CREATE USER语句创建的用户,该用户默认就会拥有USAGE权限,但是,又的确像描述中所说的那样,这个用户除了能够登录数据库,别的什么也做不了,因此就像是"没有权限"。
另外,还得再简要说一下with_option的几个选项:
l GRANT OPTION:允许用户再将该权限授予其它用户;
l MAX_QUERIES_PER_HOUR:允许用户每小时执行的查询语句数量;
l MAX_UPDATES_PER_HOUR:允许用户每小时执行的更新语句数量;
l MAX_CONNECTIONS_PER_HOUR:允许用户每小时连接的次数;
l MAX_USER_CONNECTIONS:允许用户同时连接服务器的数量;
这块的内容一看就是给用户设限制使的,我个人认为意义不大,不是说没有这类需求,而是这些选项的粒度仍然不够细致,不易碰到适合的应用场景,不过简单了解一下也是有必要的,万一哪天对某用户看着不爽,Dbaer心里应该明白,还是有法子限制该用户能够使用的资源的。
其它部分就先不多说了,何况这个事儿也不能说的太细,主要是太细的东西三思也不懂,不懂装懂这个事儿俺脸皮虽然已经很厚,但做这类事儿的时候表情总是不够自然,不过请童鞋们放心,俺一定会继续努力,争取早日复制粘贴那谁的成功,用俺的真诚蒙到别人,蒙到所有的人~~~
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-1199559/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7607759/viewspace-1199559/