【轉】MySQL GRANT:使用者授權
原文:http://c.biancheng.net/view/7502.html
---------------------
授權就是為某個使用者賦予某些許可權。例如,可以為新建的使用者賦予查詢所有資料庫和表的許可權。MySQL 提供了 GRANT 語句來為使用者設定許可權。
在 MySQL 中,擁有 GRANT 許可權的使用者才可以執行GRANT語句,其語法格式如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
其中:
- priv_type 引數表示許可權型別;
- columns_list 引數表示許可權作用於哪些列上,省略該引數時,表示作用於整個表;
- database.table用於指定許可權的級別;
- user 引數表示使用者賬戶,由使用者名稱和主機名構成,格式是“'username'@'hostname'”;
- IDENTIFIED BY 引數用來為使用者設定密碼;
- password 引數是使用者的新密碼。
WITH 關鍵字後面帶有一個或多個 with_option 引數。這個引數有 5 個選項,詳細介紹如下:
- GRANT OPTION:被授權的使用者可以將這些許可權賦予給別的使用者;
- MAX_QUERIES_PER_HOUR count:設定每個小時可以允許執行 count 次查詢;
- MAX_UPDATES_PER_HOUR count:設定每個小時可以允許執行 count 次更新;
- MAX_CONNECTIONS_PER_HOUR count:設定每小時可以建立 count 個連線;
- MAX_USER_CONNECTIONS count:設定單個使用者可以同時具有的 count 個連線。
MySQL 中可以授予的許可權有如下幾組:
- 列許可權,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 name 列的值的許可權。
- 表許可權,和一個具體表中的所有資料相關。例如,可以使用 SELECT 語句查詢表 students 的所有資料的許可權。
- 資料庫許可權,和一個具體的資料庫中的所有表相關。例如,可以在已有的資料庫 mytest 中建立新表的許可權。
- 使用者許可權,和 MySQL 中所有的資料庫相關。例如,可以刪除已有的資料庫或者建立一個新的資料庫的許可權。
對應地,在GRANT 語句中可用於指定許可權級別的值有以下幾類格式:
- *:表示當前資料庫中的所有表。
- *.*:表示所有資料庫中的所有表。
- db_name.*:表示某個資料庫中的所有表,db_name 指定資料庫名。
- db_name.tbl_name:表示某個資料庫中的某個表或檢視,db_name 指定資料庫名,tbl_name 指定表名或檢視名。
- db_name.routine_name:表示某個資料庫中的某個儲存過程或函式,routine_name 指定儲存過程名或函式名。
- TO 子句:如果許可權被授予給一個不存在的使用者,MySQL 會自動執行一條 CREATE USER 語句來建立這個使用者,但同時必須為該使用者設定密碼。
許可權型別說明
下面講解 GRANT 語句中的許可權型別(可參考《MySQL user表詳解》一節閱讀)。
1)授予資料庫許可權時,<許可權型別>可以指定為以下值:
許可權名稱 | 對應user表中的欄位 | 說明 |
---|---|---|
SELECT | Select_priv | 表示授予使用者可以使用 SELECT 語句訪問特定資料庫中所有表和檢視的許可權。 |
INSERT | Insert_priv | 表示授予使用者可以使用 INSERT 語句向特定資料庫中所有表新增資料行的許可權。 |
DELETE | Delete_priv | 表示授予使用者可以使用 DELETE 語句刪除特定資料庫中所有表的資料行的許可權。 |
UPDATE | Update_priv | 表示授予使用者可以使用 UPDATE 語句更新特定資料庫中所有資料表的值的許可權。 |
REFERENCES | References_priv | 表示授予使用者可以建立指向特定的資料庫中的表外來鍵的許可權。 |
CREATE | Create_priv | 表示授權使用者可以使用 CREATE TABLE 語句在特定資料庫中建立新表的許可權。 |
ALTER | Alter_priv | 表示授予使用者可以使用 ALTER TABLE 語句修改特定資料庫中所有資料表的許可權。 |
SHOW VIEW | Show_view_priv | 表示授予使用者可以檢視特定資料庫中已有檢視的檢視定義的許可權。 |
CREATE ROUTINE | Create_routine_priv | 表示授予使用者可以為特定的資料庫建立儲存過程和儲存函式的許可權。 |
ALTER ROUTINE | Alter_routine_priv | 表示授予使用者可以更新和刪除資料庫中已有的儲存過程和儲存函式的許可權。 |
INDEX | Index_priv | 表示授予使用者可以在特定資料庫中的所有資料表上定義和刪除索引的許可權。 |
DROP | Drop_priv | 表示授予使用者可以刪除特定資料庫中所有表和檢視的許可權。 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 表示授予使用者可以在特定資料庫中建立臨時表的許可權。 |
CREATE VIEW | Create_view_priv | 表示授予使用者可以在特定資料庫中建立新的檢視的許可權。 |
EXECUTE ROUTINE | Execute_priv | 表示授予使用者可以呼叫特定資料庫的儲存過程和儲存函式的許可權。 |
LOCK TABLES | Lock_tables_priv | 表示授予使用者可以鎖定特定資料庫的已有資料表的許可權。 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 表示以上所有許可權/超級許可權 |
2) 授予表許可權時,<許可權型別>可以指定為以下值:
許可權名稱 | 對應user表中的欄位 | 說明 |
---|---|---|
SELECT | Select_priv | 授予使用者可以使用 SELECT 語句進行訪問特定表的許可權 |
INSERT | Insert_priv | 授予使用者可以使用 INSERT 語句向一個特定表中新增資料行的許可權 |
DELETE | Delete_priv | 授予使用者可以使用 DELETE 語句從一個特定表中刪除資料行的許可權 |
DROP | Drop_priv | 授予使用者可以刪除資料表的許可權 |
UPDATE | Update_priv | 授予使用者可以使用 UPDATE 語句更新特定資料表的許可權 |
ALTER | Alter_priv | 授予使用者可以使用 ALTER TABLE 語句修改資料表的許可權 |
REFERENCES | References_priv | 授予使用者可以建立一個外來鍵來參照特定資料表的許可權 |
CREATE | Create_priv | 授予使用者可以使用特定的名字建立一個數據表的許可權 |
INDEX | Index_priv | 授予使用者可以在表上定義索引的許可權 |
ALL 或 ALL PRIVILEGES或 SUPER | Super_priv | 所有的許可權名 |
3) 授予列許可權時,<許可權型別>的值只能指定為 SELECT、INSERT 和 UPDATE,同時許可權的後面需要加上列名列表 column-list。
4) 最有效率的許可權是使用者許可權。
授予使用者許可權時,<許可權型別>除了可以指定為授予資料庫許可權時的所有值之外,還可以是下面這些值:
- CREATE USER:表示授予使用者可以建立和刪除新使用者的許可權。
- SHOW DATABASES:表示授予使用者可以使用 SHOW DATABASES 語句檢視所有已有的資料庫的定義的許可權。
例 1
使用 GRANT 語句建立一個新的使用者 testUser,密碼為 testPwd。使用者 testUser 對所有的資料有查詢、插入許可權,並授予 GRANT 許可權。SQL 語句和執行過程如下。
mysql> GRANT SELECT,INSERT ON *.* -> TO 'testUser'@'localhost' -> IDENTIFIED BY 'testPwd' -> WITH GRANT OPTION; Query OK, 0 rows affected, 1 warning (0.05 sec)
使用 SHOW GRANTS 語句查詢使用者 testUser 的許可權,如下所示。
mysql> SHOW GRANTS FOR 'testUser'@'localhost'; +-------------------------------------------------------------------------+ | Grants for testUser@localhost | +-------------------------------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------------+ 1 row in set (0.00 sec)
結果顯示,testUser 對所有資料庫的所有表有查詢、插入許可權,並可以將這些許可權賦予給別的使用者。
拓展
資料庫管理員給普通使用者授權時一定要特別小心,如果授權不當,可能會給資料庫帶來致命的破壞。一旦發現給使用者的許可權太多,應該儘快使用 REVOKE 語句將許可權收回。此處特別注意,最好不要授予普通使用者 SUPER 許可權,GRANT 許可權。關於使用者許可權的刪除,可閱讀學習《MySQL REVOKE:刪除使用者許可權》一節。