塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.3許可權級別(1)

dawn009發表於2015-06-26

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資料庫的許可權問題,將在後面章節中專門描述。

 

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

相關文章