MySQL使用者授權(GRANT)

2020-07-16 10:04:45
當成功建立使用者賬戶後,還不能執行任何操作,需要為該使用者分配適當的存取許可權。可以使用 SHOW GRANT FOR 語句來查詢使用者的許可權。

注意:新建立的使用者只有登入 MySQL 伺服器的許可權,沒有任何其他許可權,不能進行其他操作。

USAGE ON*.* 表示該使用者對任何資料庫和任何表都沒有許可權。

授予使用者許可權

對於新建的 MySQL 使用者,必須給它授權,可以用 GRANT 語句來實現對新建使用者的授權。

語法格式:
GRANT
<許可權型別> [ ( <列名> ) ] [ , <許可權型別> [ ( <列名> ) ] ]
ON <物件> <許可權級別> TO <使用者>
其中<使用者>的格式:
<使用者名稱> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
[ WITH GRANT OPTION]
| MAX_QUERIES_PER_HOUR <次數>
| MAX_UPDATES_PER_HOUR <次數>
| MAX_CONNECTIONS_PER_HOUR <次數>
| MAX_USER_CONNECTIONS <次數>
語法說明如下:

1) <列名>

可選項。用於指定許可權要授予給表中哪些具體的列。

2) ON 子句

用於指定許可權授予的物件和級別,如在 ON 關鍵字後面給出要授予許可權的資料庫名或表名等。

3) <許可權級別>

用於指定許可權的級別。可以授予的許可權有如下幾組:
  • 列許可權,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 student_name 列的值的許可權。
  • 表許可權,和一個具體表中的所有資料相關。例如,可以使用 SELECT 語句查詢表 students 的所有資料的許可權。
  • 資料庫許可權,和一個具體的資料庫中的所有表相關。例如,可以在已有的資料庫 mytest 中建立新表的許可權。
  • 使用者許可權,和 MySQL 中所有的資料庫相關。例如,可以刪除已有的資料庫或者建立一個新的資料庫的許可權。

對應地,在 GRANT 語句中可用於指定許可權級別的值有以下幾類格式:
  • *:表示當前資料庫中的所有表。
  • *.*:表示所有資料庫中的所有表。
  • db_name.*:表示某個資料庫中的所有表,db_name 指定資料庫名。
  • db_name.tbl_name:表示某個資料庫中的某個表或檢視,db_name 指定資料庫名,tbl_name 指定表名或檢視名。
  • tbl_name:表示某個表或檢視,tbl_name 指定表名或檢視名。
  • db_name.routine_name:表示某個資料庫中的某個儲存過程或函數,routine_name 指定儲存過程名或函數名。
  • TO 子句:用來設定使用者口令,以及指定被賦予許可權的使用者 user。若在 TO 子句中給系統中存在的使用者指定口令,則新密碼會將原密碼覆蓋;如果許可權被授予給一個不存在的使用者,MySQL 會自動執行一條 CREATE USER 語句來建立這個使用者,但同時必須為該使用者指定口令。

GRANT語句中的<許可權型別>的使用說明如下:

1) 授予資料庫許可權時,<許可權型別>可以指定為以下值:

  • SELECT:表示授予使用者可以使用 SELECT 語句存取特定資料庫中所有表和檢視的許可權。
  • INSERT:表示授予使用者可以使用 INSERT 語句向特定資料庫中所有表新增資料行的許可權。
  • DELETE:表示授予使用者可以使用 DELETE 語句刪除特定資料庫中所有表的資料行的許可權。
  • UPDATE:表示授予使用者可以使用 UPDATE 語句更新特定資料庫中所有資料表的值的許可權。
  • REFERENCES:表示授予使用者可以建立指向特定的資料庫中的表外來鍵的許可權。
  • CREATE:表示授權使用者可以使用 CREATE TABLE 語句在特定資料庫中建立新表的許可權。
  • ALTER:表示授予使用者可以使用 ALTER TABLE 語句修改特定資料庫中所有資料表的許可權。
  • SHOW VIEW:表示授予使用者可以檢視特定資料庫中已有檢視的檢視定義的許可權。
  • CREATE ROUTINE:表示授予使用者可以為特定的資料庫建立儲存過程和儲存函數的許可權。
  • ALTER ROUTINE:表示授予使用者可以更新和刪除資料庫中已有的儲存過程和儲存函數的許可權。
  • INDEX:表示授予使用者可以在特定資料庫中的所有資料表上定義和刪除索引的許可權。
  • DROP:表示授予使用者可以刪除特定資料庫中所有表和檢視的許可權。
  • CREATE TEMPORARY TABLES:表示授予使用者可以在特定資料庫中建立臨時表的許可權。
  • CREATE VIEW:表示授予使用者可以在特定資料庫中建立新的檢視的許可權。
  • EXECUTE ROUTINE:表示授予使用者可以呼叫特定資料庫的儲存過程和儲存函數的許可權。
  • LOCK TABLES:表示授予使用者可以鎖定特定資料庫的已有資料表的許可權。
  • ALL 或 ALL PRIVILEGES:表示以上所有許可權。

2) 授予表許可權時,<許可權型別>可以指定為以下值:

  • SELECT:授予使用者可以使用 SELECT 語句進行存取特定表的許可權。
  • INSERT:授予使用者可以使用 INSERT 語句向一個特定表中新增資料行的許可權。
  • DELETE:授予使用者可以使用 DELETE 語句從一個特定表中刪除資料行的許可權。
  • DROP:授予使用者可以刪除資料表的許可權。
  • UPDATE:授予使用者可以使用 UPDATE 語句更新特定資料表的許可權。
  • ALTER:授予使用者可以使用 ALTER TABLE 語句修改資料表的許可權。
  • REFERENCES:授予使用者可以建立一個外來鍵來參照特定資料表的許可權。
  • CREATE:授予使用者可以使用特定的名字建立一個資料表的許可權。
  • INDEX:授予使用者可以在表上定義索引的許可權。
  • ALL 或 ALL PRIVILEGES:所有的許可權名。

3) 授予列許可權時,<許可權型別>的值只能指定為 SELECT、INSERT 和 UPDATE,同時許可權的後面需要加上列名列表 column-list。

4) 最有效率的許可權是使用者許可權。

授予使用者許可權時,<許可權型別>除了可以指定為授予資料庫許可權時的所有值之外,還可以是下面這些值:
  • CREATE USER:表示授予使用者可以建立和刪除新使用者的許可權。
  • SHOW DATABASES:表示授予使用者可以使用 SHOW DATABASES 語句檢視所有已有的資料庫的定義的許可權。

【範例】使用 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)
使用 SELECT 語句查詢使用者 testUser 的許可權,如下所示。
mysql> SELECT Host,User,Select_priv,Grant_priv
    -> FROM mysql.user
    -> WHERE User='testUser';
+-----------+----------+-------------+------------+
| Host      | User     | Select_priv | Grant_priv |
+-----------+----------+-------------+------------+
| localhost | testUser | Y           | Y          |
+-----------+----------+-------------+------------+
1 row in set (0.01 sec)