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_type
、priv_level
和 object_type
值,以及用於指定使用者和密碼的語法,請參閱第 15.7.1.6 節, 「GRANT 陳述式」。
有關角色的資訊,請參閱第 8.2.10 節,「使用角色」。
當啟用 read_only
系統變數時,除了以下討論中描述的任何其他必要權限之外,REVOKE
還需要 CONNECTION_ADMIN
或權限(或已棄用的 SUPER
權限)。
顯示的所有 REVOKE
形式都支援 IF EXISTS
選項以及 IGNORE UNKNOWN USER
選項。如果沒有這些修改,REVOKE
要嘛對所有命名的使用者和角色都成功,要嘛回滾且沒有任何效果(如果發生任何錯誤);只有在對所有命名的使用者和角色都成功時,該語句才會寫入二進制日誌。 IF EXISTS
和 IGNORE 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 EXISTS
和 IGNORE 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 EXISTS
和IGNORE 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 EXISTS
和 IGNORE 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 陳述式」。