5.3 权限级别

总的来说,MySQL数据库的权限从大的粒度上划分可以分成5类:全局、数据库、表、列、程序。通过对这5个大类权限的细分,可以精确地为某个用户分配从某台机器连接进来访问某个数据库下某个表的某个列的某部分记录权限。

授权主要是通过GRANT命令(或手动向字典表中插入或修改记录),对应的权限关键字,就是5.2小节中所列的priv_type,相对于ORACLE数据库来说,我个人认为,MySQL数据库中权限设定真简单。注意,简单不是一个贬义词,三思曾经无数次无数个场合强调过这样一种观点:简单意味着灵活,而灵活在有心人的手上能实现的功能非常之强大。

本章尽可能多通过示例,帮助大家理解GRANT语句的用法,当然,最重要的是理解MySQL数据库的权限体系,考虑到MySQL中的各级权限主要基于若干个字典表,因此本段介绍时会将这几个字典表的结构列为重要参照。

提示:

user/db/host几个字典表中,host列的值对大小写不敏感。User、Password、Db和Table_name几个列值对大小写敏感。Column_name列值对大小写不敏感。

5.3.1 全局

全局这个词儿一听就知道层次很高,宏观的事物都很重要,你看当前中央电视台播音员每当提到宏观(经济数据)都是一脸的肃穆,连那个号称六十年没出过一条假新闻的人民日报,发表宏观经济数据时都兴奋的跟打了鸡血似的,不是喊保8就是喊超9,虽然我怎么也闹不明白89到底是什么情况。

具体到MySQL这样一款小软件,全局这个级别也差不到哪去,我就说一条,与全局相关的权限信息记在mysql.user表中。这下大家知道厉害了吧,mysql.user表对象里是等闲数据能待的地方吗?前面提到过,这个表管登录,控制用户能不能连接这样一等一的最重要的事情,闲杂记录能保存在这里吗。但是我们也要注意了,这个全局权限可不一定就能拥有所有的权限,它具体指的是能够拥有该MySQL服务器所有数据库的[所有]对象的[所有]权限(注:[]表示可选)。

下面,我们新创建一个用户,并授予它CREATE权限,操作如下:

(system@localhost) [(none)]> grant create on *.* to jss_global;
Query OK, 0 rows affected (0.00 sec)
system@localhost) [(none)]> select * from mysql.user where user='jss_global'\G
*************************** 1. row ***************************
Host: %
User: jss_global
Password:
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: Y
Drop_priv: N
Reload_priv: N
..........
..........
..........
1 row in set (0.00 sec)

查看返回的mysql.user表中记录的信息,所有与权限相关列的列值多都为'N',表示没有权限,只有被授予了全局操作权限,mysql.user表中权限对应列值才是'Y',这种情况下,该用户就拥有在所连接的MySQL服务器下所有数据库中执行相应操作的权限。

以前面创建的jss_global用户为例,授予了create权限之后,该用户即可轻松查看(没错,不仅能创建,还能查看),当前连接的MySQL数据库中创建的所有数据库,并能够在任意数据库中创建表对象(information_schema库除外,该库具有一定特殊性,后面章节详述)。

找台客户端,以jss_global用户登录,由于创建时没有指定主机和密码信息,因此可以从任意主机并且无须输入任何密码即可登录:

[mysql@mysqldb02 ~]$ mysql -ujss_global -h 192.168.30.243
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.6.12-log JSS for mysqltest
..........
..........
(jss_global@192.168.30.243) [(none)]>

执行SHOW DATABASES命令,可以查看当前存在的所有数据库:

(jss_global@192.168.30.243) [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jssdb              |
| jssdb_mc           |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

创建表对象,也没有问题,例如在jssdb库中创建一个名为test1的表对象:

(jss_global@192.168.30.243) [(none)]> use jssdb;
Database changed
(jss_global@192.168.30.243) [(jssdb)]> create table test1 (vl varchar(20));
Query OK, 0 rows affected (0.00 sec)

创建成功,大家可以通过SHOW TABLES命令或DESC命令查看验证,这里不演示了。

MySQL数据库中权限的设计自有其逻辑,有些设定符合人们(谨代表我个人)的常规思维,有些则跟我们下意识的认知有较大差距。

就拿刚刚演示的这个CREATE权限来说,当用户拥有全局的CREATE权限,那么它同时也级联拥有了查看所有数据库(SHOW DATABASES)和数据库下所有对象的权限,能建就能看,这点容易理解;但是另一方面,明确授予的CREATE权限,又确实只拥有"创建"的权限,想删除对象是不行的,哪怕这个对象就是它刚刚创建的:

(jss_global@192.168.30.243) [jssdb]> drop table test1;

ERROR 1142 (42000): DROP command denied to user 'jss_global'@'192.168.30.203' for table 'test1'

修改也不行:

(jss_global@192.168.30.243) [jssdb]> alter table test1 add (vl varchar(20));

ERROR 1142 (42000): ALTER command denied to user 'jss_global'@'192.168.30.203' for table 'test1'

甚至连查询都不行:

(jss_global@192.168.30.243) [jssdb]> select * from test1;

ERROR 1142 (42000): SELECT command denied to user 'jss_global'@'192.168.30.203' for table 'test1'

现在您明白了吧王总,他授予的仅仅只是CREATE权限,想删除是不行的,连查都是肯定不行的。对对,即使要删除的对象是自己刚刚创建的也不行。不不,多贵的电脑都不行。

全局这么重要的粒度,能够在这一级授予的权限自然不少,在5.2.2小节中提到的权限大部分都可以在全局级授予,与MySQL服务管理相关的权限则全部是在全局级进行设置。下表罗列了可在全局粒度授予的权限,以及该权限与mysql.user字典表列的对应关系:

User字典表列名

对应权限名

Select_priv
SELECT
Insert_priv
INSERT
Update_priv
UPDATE
Delete_priv
DELETE
Create_priv
CREATE
Drop_priv
DROP
Reload_priv
RELOAD
Shutdown_priv
SHUTDOWN
Process_priv
PROCESS
File_priv
FILE
Grant_priv
GRANT OPTION
References_priv
REFERENCES
Index_priv
INDEX
Alter_priv
ALTER
Show_db_priv
SHOW DATABASES
Super_priv
SUPER
Create_tmp_table_priv
CREATE TEMPORARY TABLES
Lock_tables_priv
LOCK TABLES
Execute_priv
EXECUTE
Repl_slave_priv
REPLICATION SLAVE
Repl_client_priv
REPLICATION CLIENT
Create_view_priv
CREATE VIEW
Show_view_priv
SHOW VIEW
Create_routine_priv
CREATE ROUTINE
Alter_routine_priv
ALTER ROUTINE
Create_user_priv
CREATE USER
Event_priv
EVENT
Trigger_priv
TRIGGER
Create_tablespace_priv
CREATE TABLESPACE

表5-3 全局权限列表

提示:默认情况下,使用CREATE USER创建的用户,能够登录MySQL数据库,并且还具有操作test库中对象的权限,这是MySQL数据库的默认设定,关于test数据库的权限问题,将在后面章节中专门描述。