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心里应该明白,还是有法子限制该用户能够使用的资源的。
















