塗抹MySQL--第5章 MySQL資料庫中的許可權體系 - 5.2許可權授予與回收(2)

dawn009發表於2015-06-26

5.2.2 授予許可權

使用者管理的核心就是許可權分配,MySQL資料庫中授予許可權有專用命令GRANT,它不僅能夠授予許可權,甚至還能建立使用者(前面小節中演示過)。嚴謹些描述,它能在建立使用者的同時授予許可權,看起來授權操作倒像是順帶的功能一樣。

GRANT命令的語法看起來可是相當複雜的吶:

GRANT

    priv_type [(column_list)]

      [, priv_type [(column_list)]] ...

    ON [object_type] priv_level

    TO user [IDENTIFIED BY [PASSWORD] 'password'] ...

    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]

    [WITH with_option ...]

除了priv_type,其它幾個加粗的幾個子項詳細語法如下:

l object_type:

    TABLE

  | FUNCTION

  | PROCEDURE

 

l priv_level:

    *

  | *.*

  | db_name.*

  | db_name.tbl_name

  | tbl_name

  | db_name.routine_name

 

l ssl_option:

    SSL

  | X509

  | CIPHER 'cipher'

  | ISSUER 'issuer'

  | SUBJECT 'subject'

 

l with_option:

    GRANT OPTION

  | MAX_QUERIES_PER_HOUR count

  | MAX_UPDATES_PER_HOUR count

  | MAX_CONNECTIONS_PER_HOUR count

  | MAX_USER_CONNECTIONS count

 

貌似漏掉了priv_type選項,放心我沒忘,最重要的priv_type需要放在最顯著的地方解說,它看起來最簡單,但可選項也最多,用於指定可授予(或收回)的許可權型別,對此官方文件中,針對可授予的許可權,專門列了個表羅列的很清晰:

許可權型別

簡要說明

ALL [PRIVILEGES]

授予除 GRANT OPTION 外的所有許可權

ALTER

允許執行ALTER TABLE操作

ALTER ROUTINE

允許修改或刪除儲存過程和函式

CREATE

允許建立資料庫和建立表物件

CREATE ROUTINE

允許建立儲存過程和函式

CREATE TABLESPACE

允許建立/修改或刪除表空間及日誌檔案組

CREATE TEMPORARY TABLES

允許執行CREATE TEMPORARY TABLE語句建立臨時表

CREATE USER

允許執行CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES語句

CREATE VIEW

允許建立/修改檢視

DELETE

允許執行DELETE語句

DROP

允許刪除資料庫/表或檢視

EVENT

允許使用Event物件

EXECUTE

允許使用者執行儲存程式

FILE

允許使用者讀寫檔案

GRANT OPTION

允許將授予的許可權再由該使用者授予其它使用者

INDEX

允許建立/刪除索引

INSERT

允許執行INSERT語句

LOCK TABLES

允許對擁有SELECT許可權的表物件執行LOCK TABLES

PROCESS

允許使用者執行SHOW PROCESSLIST命令檢視當前所有連線

PROXY

允許使用PROXY

REFERENCES

尚未應用

RELOAD

允許執行FLUSH操作

REPLICATION CLIENT

允許使用者連線複製環境中的Master/Slave

REPLICATION SLAVE

允許複製環境的slave端從master端讀取資料

SELECT

允許執行SELECT語句

SHOW DATABASES

允許執行SHOW DATABASES語句顯示所有資料庫

SHOW VIEW

允許執行SHOW CREATE VIEW檢視檢視定義

SHUTDOWN

允許透過mysqladmin命令關閉資料庫

SUPER

允許執行管理操作,比如CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL等語句

TRIGGER

允許建立或刪除觸發器

UPDATE

允許執行UPDATE操作

USAGE

意指沒有許可權(no privileges)

表5-2 MySQL使用者許可權

這個表羅列了所有可授予給使用者的許可權,不管針對什麼使用者,授予哪個物件,什麼粒度的許可權,都是從上面列表中的關鍵字中選擇。

 

以上幾段加一塊基本上就是grant語句的語法,看起來呢是複雜了一點點,不過不懂也沒關係,再說就算懂了也不一定記的住,就算記住了也不一定真能理解它在說什麼,就像現在人人都知道要先感謝國家,你懂的,人人都明白那不過就是說說(不過海外各種二代及二代親戚們說這話時應該是真心的),關鍵時刻得動真格的,得會用才行,三思爭取後面多弄幾個例子,讓大傢伙都搞明白這個事兒。

下面先舉個最簡單的例子幫助大家理解,我們要授予jss_grant@'192.168.30.203'使用者查詢mysql.user表的許可權,執行語句如下:

(system@localhost) [(none)]> grant select on mysql.user to jss_grant@'192.168.30.203';

Query OK, 0 rows affected (0.00 sec)

其中"select"對應的就是priv_type中的許可權,"mysql.user"對應priv_level中的db_name.tbl_name,這是一個最簡單的示例,當然啦,不使用grant語句,而透過insert,update方式修改字典表也是靠譜的!

話說MySQL資料庫中有些許可權的設計也很有意思,值得說道幾句。

首先是關於CREATE /DROP這類許可權,這是個很有意思的設定,拿CREATE許可權來說,如果一個使用者擁有了建庫的許可權,那麼它也一定能建立表(但不能建立檢視),此處的粒度設計沒有那麼細,MySQL資料庫並沒有將建庫和建表設計成兩種許可權,而是合二為一。DROP許可權也是類似的設計,不過與CREATE許可權有所不同的是,DROP許可權也能刪除檢視物件。其實其它資料庫中也有類似的設定,比如對於Oracle資料庫環境,某個使用者擁有建立物件的許可權的話,那麼它就一定擁有刪除這個物件的許可權。在Oracle看來,能建立就應該能刪除,這兩者是一體的,無法單獨剝離。就我個人看來,Oracle的設定明顯更為老道,而且符合邏輯,MySQL在這方面的設計還是顯的規劃有些不夠清晰。

其次關於ALL [PRIVILEGES]GRANT OPTION兩種許可權,這是兩種比較特殊的許可權,甚至在授予或收回這兩類許可權時都不能與其它許可權同時操作,並且這兩個許可權並不像它們名字顯示的那樣是"全部"的許可權,後面的示例中會演示這一點。

最後關於USAGE許可權,按照上表的描述中所示,這個許可權的功能就是"沒有許可權",但其實它不是完全沒有許可權,至少它還有一項許可權,就是"登入許可權",對於使用CREATE USER語句建立的使用者,該使用者預設就會擁有USAGE許可權,但是,又的確像描述中所說的那樣,這個使用者除了能夠登入資料庫,別的什麼也做不了,因此就像是"沒有許可權"

另外,還得再簡要說一下with_option的幾個選項:

l GRANT OPTION:允許使用者再將該許可權授予其它使用者;

l MAX_QUERIES_PER_HOUR:允許使用者每小時執行的查詢語句數量;

l MAX_UPDATES_PER_HOUR:允許使用者每小時執行的更新語句數量;

l MAX_CONNECTIONS_PER_HOUR:允許使用者每小時連線的次數;

l MAX_USER_CONNECTIONS:允許使用者同時連線伺服器的數量;

這塊的內容一看就是給使用者設限制使的,我個人認為意義不大,不是說沒有這類需求,而是這些選項的粒度仍然不夠細緻,不易碰到適合的應用場景,不過簡單瞭解一下也是有必要的,萬一哪天對某使用者看著不爽,Dbaer心裡應該明白,還是有法子限制該使用者能夠使用的資源的。

其它部分就先不多說了,何況這個事兒也不能說的太細,主要是太細的東西三思也不懂,不懂裝懂這個事兒俺臉皮雖然已經很厚,但做這類事兒的時候表情總是不夠自然,不過請童鞋們放心,俺一定會繼續努力,爭取早日複製貼上那誰的成功,用俺的真誠蒙到別人,蒙到所有的人~~~

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

相關文章