3.3、表

  表做为对象,已经进入到一个相对细粒度的权限级别,这部分权限存在于mysql.tables_priv表中。我觉着很多初学者在学习MySQL权限操作时,由于对整个权限体系了解有限,甚至可能都不知道能够为目标授予什么样的权限,这个问题解决起来也很简单,可以直接看官方文档,文档中对所有可授予的权限专门有个列表(其实前面2.2小节中列的表格就是抄自官方文档)写的清清楚楚明明白白,当然文档没准也看过,就是记不住(其实MySQL中的权限相比ORACLE已经少太多了),这处情况下问题也很好解决,desc下相关的权限表即可。

  比如说,现在不知道在表一级,究竟能够授予用户什么样的权限(或者说用户有什么样的选择),那么直接desc mysql.tables_priv即可,例如:

    mysql> desc tables_priv;

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

    | Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |

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

    | Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             |

    | Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             |

    | User        | char(16)                                                                                                                          | NO   | PRI |                   |                             |

    | Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             |

    | Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             |

    | Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

    | Table_priv  | set(¨Select¨,¨Insert¨,¨Update¨,¨Delete¨,¨Create¨,¨Drop¨,¨Grant¨,¨References¨,¨Index¨,¨Alter¨,¨Create View¨,¨Show view¨,¨Trigger¨) | NO   |     |                   |                             |

    | Column_priv | set(¨Select¨,¨Insert¨,¨Update¨,¨References¨)                                                                                      | NO   |     |                   |                             |

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

    8 rows in set (0.00 sec)

  注意看Table_priv/Column_priv两列对应的列值,这些列值就是表对象能够授予的权限。这下知道权限关键字怎么写了吧,三思老早就表达过这样一种观点,学习是有技巧的,死记硬背(SJYB)是技巧之一,但不一定是最好的,随机应变(SJYB)才是~~~

  知道了关键字,就可以根据需求具体授权了,比如说,向jss用户授予上述的全部权限,该怎么写grant语句呢:

    mysql> grant all on jssdb.j1 to jss;

    Query OK, 0 rows affected (0.00 sec)

  哎哟哟,咋没写前面desc里看到的权限关键字呢,这样写能成功授权吗,黑黑,三思都说了要SJYB的嘛,让事实来说话吧:

    mysql> select * from tables_priv where user=¨jss¨ and table_name=¨j1¨\G;

    *************************** 1. row ***************************

           Host: %

             Db: jssdb

           User: jss

     Table_name: j1

        Grantor: root@localhost

      Timestamp: 2010-08-19 17:29:32

     Table_priv: Select,Insert,Update,Delete,Create,Drop,References,Index,Alter,Create View,Show view,Trigger

    Column_priv: 

    1 row in set (0.00 sec)

    提示:

    • References权限尚未引用,无视!
    • ALL权限表示所有权限!

3.4、列

  列级权限,是MySQL权限体系中的最细粒度,属于权限体系中的高精尖武器。通过对表中列的授权,可以实现只允许从某主机来的某用户访问某库的某表的某列。

  列级权限保存在mysql.columns_priv字典中,该字典结构如下:

    mysql> use mysql

    Database changed

    mysql> desc columns_priv;

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

    | Field       | Type                                         | Null | Key | Default           | Extra |

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

    | Host        | char(60)                                     | NO   | PRI |                   |       |

    | Db          | char(64)                                     | NO   | PRI |                   |       |

    | User        | char(16)                                     | NO   | PRI |                   |       |

    | Table_name  | char(64)                                     | NO   | PRI |                   |       |

    | Column_name | char(64)                                     | NO   | PRI |                   |       |

    | Timestamp   | timestamp                                    | NO   |     | CURRENT_TIMESTAMP |       |

    | Column_priv | set(¨Select¨,¨Insert¨,¨Update¨,¨References¨) | NO   |     |                   |       |

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

    7 rows in set (0.06 sec)

  由上数据结构可以看出,对于列的权限或4中:

  • Select:查询权限;
  • Insert:插入权限;
  • Update:修改权限;
  • References:尚未应用,无视

例如:

    mysql> grant select (doc_his_id) on docresource.t_wiki_doc_his to jss@192.168.1.4 identified by ¨jss¨;

    Query OK, 0 rows affected (0.06 sec)

    mysql> show grants for jss@192.168.1.4;

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

    | Grants for jss@192.168.1.4                                                         |

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

    | GRANT USAGE ON *.* TO ¨jss¨@¨192.168.1.4¨                                          |

    | GRANT SELECT (doc_his_id) ON `docresource`.`t_wiki_doc_his` TO ¨jss¨@¨192.168.1.4¨ |

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

    2 rows in set (0.23 sec)

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss -p -h 192.168.1.250

    Enter password: ***

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 1329610

    Server version: 5.0.56-log Source distribution

    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

    This software comes with ABSOLUTELY NO WARRANTY. This is free software,

    and you are welcome to modify and redistribute it under the GPL v2 license

    Type ¨help;¨ or ¨\h¨ for help. Type ¨\c¨ to clear the current input statement.

    mysql> show databases;

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

    | Database           |

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

    | information_schema |

    | docresource        |

    | test               |

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

    3 rows in set (0.30 sec)

    mysql> use docresource;

    Database changed

    mysql> show tables;

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

    | Tables_in_docresource |

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

    | t_wiki_doc_his        |

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

    1 row in set (0.08 sec)

    mysql> desc t_wiki_doc_his;

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

    | Field      | Type       | Null | Key | Default | Extra          |

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

    | DOC_HIS_ID | bigint(16) | NO   | PRI | NULL    | auto_increment |

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

    1 row in set (0.25 sec)

  能,且仅能查看授权了的表的指定列,看起来该表似乎只有这一个列,其实是因为它只能看到这一列。

  这里需要注意的一点是,select虽然只能查指定列,但该用户查询information_schema.tables或其它相关字典表时,看到的表的信息,仍然是完整的,比如表的大小、索引大小、平均列长度等等信息。

3.5、程序(ROUTINE)

  MySQL中的程序主要是指Procedure和Function两类对象,这两类对象的权限与前面描述的4种基本无关联(如果说有的话,也只是用户是否拥有连接数据库的权限),相对比较独立。

  对于已存在的Procedure/Function,DBA可以对用户授予执行(execute)、修改(alter routine)、授予(grant)权限,这部分权限体现在mysql.procs_priv表中,例如:

    mysql> desc procs_priv;

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

    | Field        | Type                                   | Null | Key | Default           | Extra |

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

    | Host         | char(60)                               | NO   | PRI |                   |       |

    | Db           | char(64)                               | NO   | PRI |                   |       |

    | User         | char(16)                               | NO   | PRI |                   |       |

    | Routine_name | char(64)                               | NO   | PRI |                   |       |

    | Routine_type | enum(¨FUNCTION¨,¨PROCEDURE¨)           | NO   | PRI | NULL              |       |

    | Grantor      | char(77)                               | NO   | MUL |                   |       |

    | Proc_priv    | set(¨Execute¨,¨Alter Routine¨,¨Grant¨) | NO   |     |                   |       |

    | Timestamp    | timestamp                              | NO   |     | CURRENT_TIMESTAMP |       |

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

    8 rows in set (0.08 sec)

  除此之后,还可以授予用户创建(create routine)权限,这个权限在user/db/host几个表中都有体现。拥有create routine权限的用户能够创建procedure/function,这个权限是用户/库一级权限,而execute/alter routine/grant这三个权限则是对象极,都是针对某个指定的procedure/function做授权。

  关于"程序"对象的权限操作就不演示了,实在是跟之前的权限授予/收回操作没啥区别,重复的事情做起来实在没意思,灰常灰常不吸引俺,三思是个极懒惰的人,咱也从不否认这一点。如果您是由于读这篇文章上了瘾,看到这块才发现下面没有了,那也不必沮丧,俺可以负责任地告诉你,俺这只是个开头,后面至少还有三千万字节口水话,不过考虑到本文并不准备投稿,也没有计划出版发行,字数多少并不会对俺产生正收益,因此那几千万口水就不帖了,感兴趣的朋友也不用专门单独与俺联系,俺虽然懒,但总体还算是个对文字有点儿兴趣的人儿,也许过不了几天,俺自个就憋不住了,又会接着帖点别的,您就瞧好吧~~

全文完~~

=======================================

查看之前的连载:

MySQL数据库权限体系入门(5)---管理数据库权限

MySQL数据库权限体系入门(4)---管理全局权限

MySQL数据库权限体系入门(3)---管理用户权限

MySQL数据库权限体系入门(2)---创建用户

MySQL数据库权限体系入门(1)---工作原理