MySQL許可權系統簡介

panpong發表於2016-12-14

1)          許可權的授予與回收

方法一:MySQL 的許可權系統相關許可權資訊主要儲存在幾個被稱為grant tables 的系統表中,即: mysql.User,mysql.db,mysql.Host,mysql.table_priv 和mysql.column_priv。手工修改了許可權相關的表之後,都需要執行“FLUSH PRIVILEGES”命令重新載入MySQL的許可權資訊;

方法二:透過GRANT,REVOKE 或者DROP USER 命令來修改相關許可權,則不需要手工執行FLUSH PRIVILEGES 命令;因為透過GRANT,REVOKE 或者DROP USER 命令所做的許可權修改在修改系統表的同時也會更新記憶體結構中的許可權資訊。在MySQL5.0.2 或更高版本的時候,MySQL 還增加了CREATE USER 命令,以此建立無任何特別許可權(僅擁有初始USAGE許可權)的使用者,透過CREATE USER 命令建立新了新使用者之後,新使用者的資訊也會自動更新到記憶體結構中。所以,建議讀者一般情況下儘量使用GRANT,REVOKE,CREATE USER 以及DROP  USER 命令來進行使用者和許可權的變更操作,儘量減少直接修改grant tables 來實現使用者和許可權變更的操作。

2)          檢視授予的許可權

檢視某個使用者目前擁有的許可權,這可以透過兩個方式實現:

首先是透過執行“SHOW GRANTS FOR 'username'@'hostname'” 命令來獲取之前該使用者身上的所有授權。

另一種方法是查詢grant tables 裡面的許可權資訊。

3)          許可權級別

MySQL 中的許可權分為五個級別,分別如下:

許可權

Global

Database

Table

Column

Routine

INSERT

Y

Y

Y

Y

SELECT

Y

Y

Y

Y

UPDATE

Y

Y

Y

Y

ALTER

Y

Y

Y

CREATE

Y

Y

Y

DELETE

Y

Y

Y

DROP

Y

Y

Y

INDEX

Y

Y

Y

ALTER  ROUTINE

Y

Y

Y

EXECUTE

Y

Y

Y

ALL  [PRIVILEGES]

Y

Y

CREATE  ROUTINE

Y

Y

CREATE  TABLESPACE

Y

Y

CREATE  TEMPORARY TABLES

Y

Y

CREATE  VIEW

Y

Y

EVENT

Y

Y

GRANT  OPTION

Y

Y

LOCK  TABLES

Y

Y

PROXY

Y

Y

REFERENCES

Y

Y

SHOW  DATABASES

Y

Y

SHOW  VIEW

Y

Y

TRIGGER

Y

Y

CREATE  USER

Y

FILE

Y

PROCESS

Y

RELOAD

Y

REPLICATION  CLIENT

Y

REPLICATION  SLAVE

Y

SHUTDOWN

Y

SUPER

Y

USAGE

Y


(1)Global Level

要授予Global Level 的許可權,則只需要在執行GRANT 命令的時候,用“*.*”來指定適用範圍是Global 的即可,當有多個許可權需要授予的時候,也並不需要多次重複執行GRANT命令,只需要一次將所有需要的許可權名稱透過逗號(“,”)分隔開即可,如下:

mysql> GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO 'def'@'localhost';


(2)Database Level

如果要授予Database Level 的許可權,則可以有兩種實現方式:

1、在執行GRANT 命令的時候,透過“database.*”來限定許可權作用域為database 整個資料庫,如下:

root@localhost : mysql 06:06:26> GRANT ALTER ON test.* TO 'def'@'localhost';

2、先透過USE 命令選定需要授權的資料庫,然後透過“*”來限定作用域,這樣授權的作用域實際上就是當前選定的整個資料庫。

root@localhost : mysql 06:14:05> USE test;

root@localhost : test 06:13:10> GRANT DROP ON * TO 'def'@'localhost';

在授予許可權的時候,如果有相同的許可權需要授予多個使用者,我們也可以在授權語句中一次寫上多個使用者資訊,透過逗號(,)分隔開就可以了,如下:

root@localhost : mysql 05:22:32> grant create on perf.* to'abc'@'localhost','def'@'localhost';

(3)Table Level

Table Level 的許可權作用範圍是授權語句中所指定資料庫的指定表。如可以透過如下語句給test 資料庫的t1 表授權:

root@localhost : test 12:02:15> GRANT INDEX ON test.t1 TO

上面的授權語句在測試給test 資料庫的t1 表授予Table Level 的許可權的同時,還測試了將許可權授予含有萬用字元“%”的所有“.jianzhaoyang.com”主機。其中的USAGE 許可權是每個使用者都有的最基本許可權。

(4)Column Level

Column Level 的許可權授權語句語法基本和Table Level 差不多,只是需要在許可權名稱後面將需要授權的列名列表透過括號括起來,如下:

root@localhost : test 12:14:46> GRANT SELECT(id,value) ON test.t2 TO

注意:當某個使用者在向某個表插入(INSERT)資料的時候,如果該使用者在該表中某列上面沒有INSERT 許可權,則該列的資料將以預設值填充。這一點和很多其他的資料庫都有一些區別,是MySQL 自己在SQL 上面所做的擴充套件。

(5)Routine Level

Routine Level 的許可權主要只有EXECUTE 和ALTER ROUTINE 兩種,主要針對的物件是procedure 和function 這兩種物件,在授予Routine Level 許可權的時候,需要指定資料庫和相關物件,如:

root@localhost : test 04:03:26> GRANT EXECUTE ON test.p1 to

 

除了上面幾類許可權之外,還有一個非常特殊的許可權GRANT,擁有GRANT 許可權的使用者可以將自身所擁有的任何許可權全部授予其他任何使用者,所以GRANT 許可權是一個非常特殊也非常重要的許可權。GRANT 許可權的授予方式也和其他任何許可權都不太一樣,通常都是透過在執行GRANT 授權語句的時候在最後新增WITH GRANT OPTION 子句達到授予GRANT 許可權的目的。此外,我們還可以透過GRANT ALL 語句授予某個Level 的所有可用許可權給某個使用者,如:

root@localhost : test 04:15:48> grant all on test.t5 to 'abc';

root@localhost : test 04:27:39> grant all on perf.* to 'abc';

在以上五個Level 的許可權中,Table、Column 和Routine 三者在授權中所依賴(或者引用)的物件必須是已經存在的,而不像Database Level 的許可權授予,可以在當前不存在該資料庫的時候就完成授權。

【參考】
【1】MySQL效能調優與架構設計 PDF中文版全冊.pdf,

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

相關文章