三、权限级别

  总的来看,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表。默认情况下,使用CREATE USER创建的用户拥有登录MySQL数据库的权限和操作test库的权限(关于test数据库的权限问题,将在后面章节中专门描述),此时查看mysql.user表中的信息,所有与权限相关列的列值均应为¨N¨,表示无权限,一旦授予了全局操作权限,则mysql.user表中权限对应列值应变为¨Y¨,这样,该用户就拥有在所连接的MySQL服务器下所有数据库中执行相应操作的权限。

  例如,新建用户jss,并授予所有数据库中拥有create表的权限,操作如下:

    mysql> create user jss@¨%¨ identified by ¨jss¨;

    Query OK, 0 rows affected (0.00 sec)

    mysql> grant create on *.* to jss;

    Query OK, 0 rows affected (0.00 sec)

    mysql> select * from user where user=¨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: 0

    1 row in set (0.00 sec)

  此权一授,则该用户可轻松查看当前连接的MySQL数据库中创建的所有db,并能够在任意db中创建表对象(information_schema库除外,该库具有一定特殊性,后面章节详述)。

    mysql> select user();

    +---------------+

    | user()        |

    +---------------+

    | jss@10.0.0.99 |

    +---------------+

    1 row in set (0.01 sec)

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | jssdb              |

    | mysql              |

    | test               |

    +--------------------+

    4 rows in set (0.00 sec)

    mysql> use jssdb;

    Database changed

    mysql> create table j1 (id int);

    Query OK, 0 rows affected (0.03 sec)

  不过需要注意,CREATE权限特指CREATE表对象,别的权限没有,例如,想删除或修改对象是不行的,甚至想查询该对象也是不行的:

    mysql> drop table j1;

    ERROR 1142 (42000): DROP command denied to user ¨jss¨@¨10.0.0.99¨ for table ¨j1¨

    mysql> alter table j1 add vl varchar(20);

    ERROR 1142 (42000): ALTER command denied to user ¨jss¨@¨10.0.0.99¨ for table ¨j1¨

    mysql> select * from j1;

    ERROR 1142 (42000): SELECT command denied to user ¨jss¨@¨10.0.0.99¨ for table ¨a1¨

  是这样的网总:我们授予的仅仅只是create权限,想删除是不行的是肯定不行的。对对,即使要删除的对象是自己刚刚创建的也不行。不不,多贵的电脑都不行。

  这点与ORACLE数据库中对应权限的设计并不相同,ORACLE中的用户拥有CREATE对象的话,同时默认也将拥有该对象的ALTER、DROP、GRANT等权限。

    提示:

    全局下的CREATE权限不仅能够建表,还能够建库。