三、权限级别
总的来看,MYSQL的权限从大的粒度上划分可以分成5类:全局、数据库、表、列、程序,通过对这5个大类权限的细分,可以精确地为某个用户分配从某台机器连接进来访问某个数据库下某个表的某个列的某部分权限。
授权主要是通过grant命令(或手动向字典表中插入或修改记录),对应的权限关键字,就是2.2小节中所列的priv_type,相对于ORACLE数据库来说,我个人认为,MySQL数据库中权限设定真简单,注意,简单不是一个贬义词,三思曾经无数次无数个场合强调过这样一种观点:简单意味着灵活,而灵活在有心人的手上能实现的功能非常之强大。
本章尽可能多的通过示例,帮助大家理解GRANT语句的用法,当然,最重要的是理解MySQL数据库的权限体系。
提示:user/db/host几个字典表中,host值的比较对大小写不敏感。User、Password、Db和Table_name值对大小写敏感。Column_name值对大小写不敏感。
3.1、全局
所谓全局,指定的是拥有该Mysql服务器所有数据库的[所有]对象的[所有]权限(注:[]表示可选),与全局相关的权限信息记入mysql.user表。默认情况下,使用CREATEUSER创建的用户拥有登录MySQL数据库的权限和操作test库的权限(关于test数据库的权限问题,将在后面章节中专门描述),此时查看mysql.user表中的信息,所有与权限相关列的列值均应为'N',表示无权限,一旦授予了全局操作权限,则mysql.user表中权限对应列值应变为'Y',这样,该用户就拥有在所连接的MySQL服务器下所有数据库中执行相应操作的权限。
例如,新建用户jss,并授予所有数据库中拥有create表的权限,操作如下:
mysql>createuserjss@'%'identifiedby'jss';
QueryOK,0rowsaffected(0.00sec)
mysql>grantcreateon*.*tojss;
QueryOK,0rowsaffected(0.00sec)
mysql>select*fromuserwhereuser='jss'\G
***************************1.row***************************
Host:%
User:jss
Password:*284578888014774CC4EF4C5C292F694CEDBB5457
Select_priv:N
Insert_priv:N
Update_priv:N
Delete_priv:N
Create_priv:Y
Drop_priv:N
Reload_priv:N
Shutdown_priv:N
Process_priv:N
File_priv:N
Grant_priv:N
References_priv:N
Index_priv:N
Alter_priv:N
Show_db_priv:N
Super_priv:N
Create_tmp_table_priv:N
Lock_tables_priv:N
Execute_priv:N
Repl_slave_priv:N
Repl_client_priv:N
Create_view_priv:N
Show_view_priv:N
Create_routine_priv:N
Alter_routine_priv:N
Create_user_priv:N
Event_priv:N
Trigger_priv:N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions:0
max_updates:0
max_connections:0
max_user_connections:01rowinset(0.00sec)
此权一授,则该用户可轻松查看当前连接的MySQL数据库中创建的所有db,并能够在任意db中创建表对象(information_schema库除外,该库具有一定特殊性,后面章节详述)。
mysql>selectuser();
+---------------+
|user()|
+---------------+
|jss@10.0.0.99|
+---------------+
1rowinset(0.01sec)
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|jssdb|
|mysql|
|test|
+--------------------+
4rowsinset(0.00sec)
mysql>usejssdb;
Databasechanged
mysql>createtablej1(idint);QueryOK,0rowsaffected(0.03sec)
不过需要注意,CREATE权限特指CREATE表对象,别的权限没有,例如,想删除或修改对象是不行的,甚至想查询该对象也是不行的:
mysql>droptablej1;
ERROR1142(42000):DROPcommanddeniedtouser'jss'@'10.0.0.99'fortable'j1'
mysql>altertablej1addvlvarchar(20);
ERROR1142(42000):ALTERcommanddeniedtouser'jss'@'10.0.0.99'fortable'j1'
mysql>select*fromj1;ERROR1142(42000):SELECTcommanddeniedtouser'jss'@'10.0.0.99'fortable'a1'
是这样的网总:我们授予的仅仅只是create权限,想删除是不行的是肯定不行的。对对,即使要删除的对象是自己刚刚创建的也不行。不不,多贵的电脑都不行。
这点与ORACLE数据库中对应权限的设计并不相同,ORACLE中的用户拥有CREATE对象的话,同时默认也将拥有该对象的ALTER、DROP、GRANT等权限。
提示:全局下的CREATE权限不仅能够建表,还能够建库。
=======================================
查看之前的连载: