MySQL資料庫許可權體系入門(6)---管理表、列及程式相關許可權

junsansi發表於2010-10-28

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)---工作原理


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-677004/,如需轉載,請註明出處,否則將追究法律責任。

相關文章