文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.1.8 REVOKE 陳述式

REVOKE [IF EXISTS]
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] PROXY ON user_or_role
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] role [, role ] ...
    FROM user_or_role [, user_or_role ] ...
    [IGNORE UNKNOWN USER]

user_or_role: {
    user (see Section 8.2.4, “Specifying Account Names”)
  | role (see Section 8.2.5, “Specifying Role Names”
}

REVOKE 陳述式允許系統管理員撤銷權限和角色,這些權限和角色可以從使用者帳戶和角色中撤銷。

有關權限存在的層級、允許的 priv_typepriv_levelobject_type 值,以及用於指定使用者和密碼的語法,請參閱第 15.7.1.6 節, 「GRANT 陳述式」

有關角色的資訊,請參閱第 8.2.10 節,「使用角色」

當啟用 read_only 系統變數時,除了以下討論中描述的任何其他必要權限之外,REVOKE 還需要 CONNECTION_ADMIN 或權限(或已棄用的 SUPER 權限)。

顯示的所有 REVOKE 形式都支援 IF EXISTS 選項以及 IGNORE UNKNOWN USER 選項。如果沒有這些修改,REVOKE 要嘛對所有命名的使用者和角色都成功,要嘛回滾且沒有任何效果(如果發生任何錯誤);只有在對所有命名的使用者和角色都成功時,該語句才會寫入二進制日誌。 IF EXISTSIGNORE UNKNOWN USER 的精確效果將在本節稍後討論。

每個帳戶名稱使用 第 8.2.4 節「指定帳戶名稱」 中描述的格式。每個角色名稱使用 第 8.2.5 節「指定角色名稱」 中描述的格式。例如:

REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';

如果省略帳戶或角色名稱的主機名稱部分,則預設為 '%'

要使用第一個 REVOKE 語法,您必須擁有 GRANT OPTION 權限,並且您必須擁有要撤銷的權限。

要撤銷所有權限,請使用第二個語法,它會刪除命名使用者或角色的所有全域、資料庫、資料表、資料行和常式權限。

REVOKE ALL PRIVILEGES, GRANT OPTION
  FROM user_or_role [, user_or_role] ...

REVOKE ALL PRIVILEGES, GRANT OPTION 不會撤銷任何角色。

要使用這個 REVOKE 語法,您必須擁有全域 CREATE USER 權限,或 mysql 系統綱要的 UPDATE 權限。

REVOKE 關鍵字後接一個或多個角色名稱的語法,採用 FROM 子句來指示要從中撤銷角色的一個或多個使用者或角色。

IF EXISTSIGNORE UNKNOWN USER 選項具有此處列出的效果:

  • IF EXISTS 表示,如果目標使用者或角色存在,但由於任何原因未找到指派給目標的任何權限或角色,則會發出警告,而不是錯誤;如果陳述式命名的權限或角色未指派給目標,則陳述式沒有(其他)效果。否則,REVOKE 會正常執行;如果使用者不存在,則陳述式會引發錯誤。

    範例:假設資料庫 test 中有資料表 t1,我們執行以下陳述式,並顯示結果。

    mysql> CREATE USER jerry@localhost;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 't1' 
    mysql> REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 1147
    Message: There is no such grant defined for user 'jerry' on host 'localhost' on
    table 't1' 
    1 row in set (0.00 sec)

    即使命名的權限或角色不存在,或陳述式嘗試在錯誤的層級指派它,IF EXISTS 也會將錯誤降級為警告。

  • 如果 REVOKE 陳述式包含 IGNORE UNKNOWN USER,則陳述式會針對陳述式中命名的任何目標使用者或角色(但未找到)發出警告;如果陳述式命名的任何目標都不存在,則 REVOKE 會成功,但沒有實際效果。否則,陳述式會像往常一樣執行,並且嘗試撤銷未指派給目標的權限(無論出於何種原因)都會引發預期的錯誤。

    範例(接續上一個範例)

    mysql> DROP USER IF EXISTS jerry@localhost;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 't1' 
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost IGNORE UNKNOWN USER;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 3162
    Message: Authorization ID jerry does not exist.
    1 row in set (0.00 sec)
  • IF EXISTSIGNORE UNKNOWN USER 的組合表示 REVOKE 永遠不會針對未知的目標使用者或角色或未指派或不可用的權限引發錯誤,並且在這種情況下,整個陳述式都會成功;只要有可能,角色或權限會從現有的目標使用者或角色中移除,並且任何不可能的撤銷都會引發警告並作為 NOOP 執行。

    範例(再次接續上一個項目的範例)

    # No such user, no such role
    mysql> DROP ROLE IF EXISTS Bogus;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
    mysql> SHOW WARNINGS;
    +-------+------+----------------------------------------------+
    | Level | Code | Message                                      |
    +-------+------+----------------------------------------------+
    | Note  | 3162 | Authorization ID 'Bogus'@'%' does not exist. |
    +-------+------+----------------------------------------------+
    1 row in set (0.00 sec)
    
    # This statement attempts to revoke a nonexistent role from a nonexistent user
    mysql> REVOKE Bogus ON test FROM jerry@localhost;
    ERROR 3619 (HY000): Illegal privilege level specified for test
    
    # The same, with IF EXISTS
    mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 'test' 
    
    # The same, with IGNORE UNKNOWN USER
    mysql> REVOKE Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER;
    ERROR 3619 (HY000): Illegal privilege level specified for test
    
    # The same, with both options
    mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+--------------------------------------------+
    | Level   | Code | Message                                    |
    +---------+------+--------------------------------------------+
    | Warning | 3619 | Illegal privilege level specified for test |
    | Warning | 3162 | Authorization ID jerry does not exist.     |
    +---------+------+--------------------------------------------+
    2 rows in set (0.00 sec)

mandatory_roles 系統變數值中命名的角色無法撤銷。當 IF EXISTSIGNORE UNKNOWN USER 一起用於嘗試移除強制權限的陳述式時,嘗試執行此操作通常會引發的錯誤會被降級為警告;陳述式會成功執行,但不會進行任何變更。

撤銷的角色會立即影響從中撤銷它的任何使用者帳戶,這樣在該帳戶的任何目前工作階段中,其權限會在下一個執行的陳述式進行調整。

撤銷角色會撤銷角色本身,而不是它代表的權限。假設一個帳戶被授予一個包含特定權限的角色,並且還被明確授予該權限或另一個包含該權限的角色。在這種情況下,如果第一個角色被撤銷,該帳戶仍然擁有該權限。例如,如果一個帳戶被授予兩個都包含 SELECT 的角色,則在撤銷任何一個角色後,該帳戶仍然可以進行選取。

REVOKE ALL ON *.*(在全域層級)會撤銷所有授予的靜態全域權限和所有授予的動態權限。

已授予但伺服器未知的已撤銷權限會被警告撤銷。這種情況可能會發生在動態權限上。例如,動態權限可以在安裝註冊它的元件時授予,但如果該元件隨後被解除安裝,則該權限會變成未註冊的狀態,儘管擁有該權限的帳戶仍然擁有它,並且可以從它們那裡撤銷。

REVOKE 會移除權限,但不會從 mysql.user 系統資料表中移除資料列。要完全移除使用者帳戶,請使用 DROP USER。請參閱 第 15.7.1.5 節「DROP USER 陳述式」

如果授權資料表包含含有大小寫混合的資料庫或資料表名稱的權限資料列,並且 lower_case_table_names 系統變數設定為非零值,則無法使用 REVOKE 撤銷這些權限。在這種情況下,必須直接操作授權資料表。(當設定 lower_case_table_names 時,GRANT 不會建立此類資料列,但在設定變數之前可能已建立此類資料列。lower_case_table_names 設定只能在初始化伺服器時設定。)

mysql 程式成功執行時,REVOKE 會回應 Query OK, 0 rows affected。要判斷操作後剩餘的權限,請使用 SHOW GRANTS。請參閱 第 15.7.7.22 節「SHOW GRANTS 陳述式」