GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
[AS user
[WITH ROLE
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
]
]
}
GRANT PROXY ON user_or_role
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
GRANT role [, role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user_or_role: {
user (see Section 8.2.4, “Specifying Account Names”)
| role (see Section 8.2.5, “Specifying Role Names”)
}
GRANT
陳述式會將權限與角色指派給 MySQL 使用者帳戶和角色。GRANT
陳述式有幾個方面,將在以下主題中說明
GRANT
語句讓系統管理員能夠授予權限和角色,這些權限和角色可以授予給使用者帳戶和角色。以下語法限制適用:
有關角色的更多資訊,請參閱第 8.2.10 節,「使用角色」。
若要使用 GRANT
授予權限,您必須擁有 GRANT OPTION
權限,並且必須擁有您正在授予的權限。(或者,如果您對 mysql
系統架構中的授權表具有 UPDATE
權限,則可以將任何權限授予任何帳戶。)當啟用 read_only
系統變數時,GRANT
還需要 CONNECTION_ADMIN
權限(或已棄用的 SUPER
權限)。
如果發生任何錯誤,GRANT
會針對所有指定的使用者和角色成功,或回滾且沒有任何效果。只有在所有指定的使用者和角色都成功時,語句才會寫入二進制日誌。
REVOKE
語句與 GRANT
相關,並讓管理員能夠移除帳戶權限。請參閱 第 15.7.1.8 節,「REVOKE 語句」。
每個帳戶名稱都使用第 8.2.4 節,「指定帳戶名稱」中描述的格式。每個角色名稱都使用 第 8.2.5 節,「指定角色名稱」中描述的格式。例如:
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';
如果省略帳戶或角色名稱的主機名稱部分,則預設為 '%'
。
通常,資料庫管理員首先使用 CREATE USER
建立帳戶並定義其非權限特性,例如密碼、是否使用安全連線,以及對伺服器資源的存取限制,然後使用 GRANT
定義其權限。ALTER USER
可用於變更現有帳戶的非權限特性。例如:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
從 mysql 程式,GRANT
在成功執行時會回應 Query OK, 0 rows affected
。若要判斷操作產生的權限為何,請使用 SHOW GRANTS
。請參閱 第 15.7.7.22 節,「SHOW GRANTS 語句」。
在某些情況下,GRANT
可能會記錄在伺服器日誌中,或在客戶端記錄於歷史檔案中,例如 ~/.mysql_history
,這表示任何擁有該資訊讀取權限的人都可以讀取明文密碼。有關伺服器日誌中發生這種情況的條件以及如何控制它的資訊,請參閱第 8.1.2.3 節,「密碼和記錄」。有關客戶端記錄的類似資訊,請參閱 第 6.5.1.3 節,「mysql 客戶端記錄」。
GRANT
支援長度最多 255 個字元的主機名稱。使用者名稱最多可包含 32 個字元。資料庫、資料表、資料行和常式名稱最多可包含 64 個字元。
請勿嘗試透過變更 mysql.user
系統表來變更使用者名稱的允許長度。這樣做會導致無法預測的行為,甚至可能導致使用者無法登入 MySQL 伺服器。除了第 3 章,升級 MySQL中所述程序之外,切勿以任何方式變更 mysql
系統架構中資料表的結構。
GRANT
語句中的數個物件需要引用,雖然在許多情況下引用是選用的:帳戶、角色、資料庫、資料表、資料行和常式名稱。例如,如果帳戶名稱中的 user_name
或 host_name
值作為未引用的識別碼是合法的,則您不需要引用它。但是,必須使用引號來指定包含特殊字元(例如 -
)的 user_name
字串,或包含特殊字元或萬用字元(例如 %
)的 host_name
字串(例如 'test-user'@'%.com'
)。分別引用使用者名稱和主機名稱。
若要指定引用的值:
將資料庫、資料表、資料行和常式名稱引用為識別碼。
將使用者名稱和主機名稱引用為識別碼或字串。
將密碼引用為字串。
有關字串引用和識別碼引用準則,請參閱 第 11.1.1 節,「字串字面值」和 第 11.2 節,「架構物件名稱」。
以下幾段中描述的萬用字元 %
和 _
的使用已棄用,因此可能會在未來版本的 MySQL 中移除。
在 GRANT
語句中指定資料庫名稱時,允許使用 _
和 %
萬用字元,這些語句會授予資料庫層級的權限 (GRANT ... ON
)。這表示,例如,若要使用 db_name
.*_
字元作為資料庫名稱的一部分,請在 GRANT
語句中使用 \
跳脫字元將其指定為 \_
,以防止使用者能夠存取符合萬用字元模式的其他資料庫(例如,GRANT ... ON `foo\_bar`.* TO ...
)。
發出包含萬用字元的數個 GRANT
語句可能不會對 DML 語句產生預期的效果;在解析涉及萬用字元的授權時,MySQL 只會考慮第一個符合的授權。換句話說,如果使用者有兩個使用萬用字元且符合相同資料庫的資料庫層級授權,則會套用先建立的授權。考慮使用此處顯示的語句建立的資料庫 db
和資料表 t
:
mysql> CREATE DATABASE db;
Query OK, 1 row affected (0.01 sec)
mysql> CREATE TABLE db.t (c INT);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO db.t VALUES ROW(1);
Query OK, 1 row affected (0.00 sec)
接下來(假設目前帳戶是 MySQL root
帳戶或另一個具有必要權限的帳戶),我們會建立使用者 u
,然後發出兩個包含萬用字元的 GRANT
語句,如下所示:
mysql> CREATE USER u;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT SELECT ON `d_`.* TO u;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT INSERT ON `d%`.* TO u;
Query OK, 0 rows affected (0.00 sec)
mysql> EXIT
Bye
如果我們結束工作階段,然後再次使用 mysql 客戶端登入,這次是以 u 身分登入,我們會看到此帳戶只有第一個符合授權提供的權限,但沒有第二個:
$> mysql -uu -hlocalhost
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.4.0-tr Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> TABLE db.t;
+------+
| c |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> INSERT INTO db.t VALUES ROW(2);
ERROR 1142 (42000): INSERT command denied to user 'u'@'localhost' for table 't'
在權限指派中,在以下情況下,MySQL 會將資料庫名稱中未跳脫的 _
和 %
SQL 萬用字元解譯為文字字元:
當資料庫名稱不用於授予資料庫層級的權限時,而是作為限定詞,用於授予其他物件(例如資料表或常式)的權限時(例如,
GRANT ... ON
)。db_name
.tbl_name
啟用
partial_revokes
會導致 MySQL 將資料庫名稱中未跳脫的_
和%
萬用字元解譯為文字字元,就像它們已跳脫為\_
和\%
一樣。因為這會變更 MySQL 解譯權限的方式,因此建議在可能啟用partial_revokes
的安裝中,避免在權限指派中使用未跳脫的萬用字元。有關更多資訊,請參閱 第 8.2.12 節,「使用部分撤銷來限制權限」。
GRANT
語句中的 user
值表示語句適用的 MySQL 帳戶。為了允許將權限授予來自任意主機的使用者,MySQL 支援以 '
形式指定 user_name
'@'host_name
'user
值。
您可以在主機名稱中指定萬用字元。例如,'
適用於 user_name
'@'%.example.com'example.com
網域中任何主機的 user_name
,而 '
適用於 user_name
'@'198.51.100.%'198.51.100
C 類子網路中任何主機的 user_name
。
簡單形式 '
是 user_name
''
的同義詞。user_name
'@'%'
MySQL 也會自動將授予 '
的所有權限指派給 username
'@'%''
帳戶。此行為已棄用,並可能會在未來版本的 MySQL 中移除。username
'@'localhost'
MySQL 不支援使用者名稱中的萬用字元。若要參照匿名使用者,請使用 GRANT
語句指定具有空使用者名稱的帳戶:
GRANT ALL ON test.* TO ''@'localhost' ...;
在這種情況下,任何從本機主機使用匿名使用者正確密碼連線的使用者都被允許存取,且具有與匿名使用者帳戶相關聯的權限。
有關帳戶名稱中使用者名稱和主機名稱值的其他資訊,請參閱 第 8.2.4 節,「指定帳戶名稱」。
如果您允許本機匿名使用者連線到 MySQL 伺服器,您也應該將權限授予所有本機使用者,格式為 '
。否則,當具名使用者嘗試從本機登入 MySQL 伺服器時,將會使用 user_name
'@'localhost'mysql.user
系統表格中 localhost
的匿名使用者帳戶。詳細資訊請參閱第 8.2.6 節,〈存取控制,階段 1:連線驗證〉。
若要判斷此問題是否適用於您,請執行下列查詢,此查詢會列出任何匿名使用者
SELECT Host, User FROM mysql.user WHERE User='';
若要避免剛才描述的問題,請使用下列陳述式刪除本機匿名使用者帳戶
DROP USER ''@'localhost';
下表總結了可為 GRANT
和 REVOKE
陳述式指定的允許的靜態和動態 priv_type
權限類型,以及每個權限可以授予的層級。有關每個權限的更多資訊,請參閱第 8.2.2 節,〈MySQL 提供的權限〉。有關靜態權限和動態權限之間差異的資訊,請參閱靜態與動態權限。
表 15.11:用於 GRANT 和 REVOKE 的允許靜態權限
權限 | 意義和可授權的層級 |
---|---|
ALL [PRIVILEGES] |
在指定的存取層級授予所有權限,除了 GRANT OPTION 和 PROXY 之外。 |
ALTER |
啟用 ALTER TABLE 的使用。層級:全域、資料庫、資料表。 |
ALTER ROUTINE |
啟用儲存常式被變更或捨棄。層級:全域、資料庫、常式。 |
CREATE |
啟用資料庫和資料表的建立。層級:全域、資料庫、資料表。 |
CREATE ROLE |
啟用角色建立。層級:全域。 |
CREATE ROUTINE |
啟用儲存常式建立。層級:全域、資料庫。 |
CREATE TABLESPACE |
啟用表空間和日誌檔案群組的建立、變更或捨棄。層級:全域。 |
CREATE TEMPORARY TABLES |
啟用 CREATE TEMPORARY TABLE 的使用。層級:全域、資料庫。 |
CREATE USER |
啟用 CREATE USER 、DROP USER 、RENAME USER 和 REVOKE ALL PRIVILEGES 的使用。層級:全域。 |
CREATE VIEW |
啟用檢視的建立或變更。層級:全域、資料庫、資料表。 |
DELETE |
啟用 DELETE 的使用。層級:全域、資料庫、資料表。 |
DROP |
啟用資料庫、資料表和檢視的捨棄。層級:全域、資料庫、資料表。 |
DROP ROLE |
啟用角色的捨棄。層級:全域。 |
EVENT |
啟用事件排程器的事件使用。層級:全域、資料庫。 |
EXECUTE |
啟用使用者執行儲存常式。層級:全域、資料庫、常式。 |
FILE |
啟用使用者導致伺服器讀取或寫入檔案。層級:全域。 |
FLUSH_PRIVILEGES |
啟用使用者發出 FLUSH PRIVILEGES 陳述式。層級:全域。 |
GRANT OPTION |
啟用將權限授予其他帳戶或從其他帳戶移除權限。層級:全域、資料庫、資料表、常式、proxy。 |
INDEX |
啟用索引的建立或捨棄。層級:全域、資料庫、資料表。 |
INSERT |
啟用 INSERT 的使用。層級:全域、資料庫、資料表、欄。 |
LOCK TABLES |
啟用對您擁有 SELECT 權限的資料表使用 LOCK TABLES 。層級:全域、資料庫。 |
OPTIMIZE_LOCAL_TABLE |
啟用 OPTIMIZE LOCAL TABLE 或 OPTIMIZE NO_WRITE_TO_BINLOG TABLE 的使用。層級:全域、資料庫、資料表。 |
PROCESS |
啟用使用者使用 SHOW PROCESSLIST 查看所有程序。層級:全域。 |
PROXY |
啟用使用者 proxy。層級:從使用者到使用者。 |
REFERENCES |
啟用外來索引鍵建立。層級:全域、資料庫、資料表、欄。 |
RELOAD |
啟用 FLUSH 操作的使用。層級:全域。 |
REPLICATION CLIENT |
啟用使用者詢問來源或複本伺服器所在位置。層級:全域。 |
REPLICATION SLAVE |
啟用複本從來源讀取二進位日誌事件。層級:全域。 |
SELECT |
啟用 SELECT 的使用。層級:全域、資料庫、資料表、欄。 |
SHOW DATABASES |
啟用 SHOW DATABASES 以顯示所有資料庫。層級:全域。 |
SHOW VIEW |
啟用 SHOW CREATE VIEW 的使用。層級:全域、資料庫、資料表。 |
SHUTDOWN |
啟用 mysqladmin shutdown 的使用。層級:全域。 |
SUPER |
啟用其他管理操作的使用,例如 CHANGE REPLICATION SOURCE TO 、KILL 、PURGE BINARY LOGS 、SET GLOBAL 和 mysqladmin debug 命令。層級:全域。 |
TRIGGER |
啟用觸發程序操作。層級:全域、資料庫、資料表。 |
UPDATE |
啟用 UPDATE 的使用。層級:全域、資料庫、資料表、欄。 |
USAGE |
與「沒有權限」同義 |
表 15.12:用於 GRANT 和 REVOKE 的允許動態權限
權限 | 意義和可授權的層級 |
---|---|
APPLICATION_PASSWORD_ADMIN |
啟用雙重密碼管理。層級:全域。 |
AUDIT_ABORT_EXEMPT |
允許稽核日誌篩選器封鎖的查詢。層級:全域。 |
AUDIT_ADMIN |
啟用稽核日誌組態。層級:全域。 |
AUTHENTICATION_POLICY_ADMIN |
啟用驗證原則管理。層級:全域。 |
BACKUP_ADMIN |
啟用備份管理。層級:全域。 |
BINLOG_ADMIN |
啟用二進位日誌控制。層級:全域。 |
BINLOG_ENCRYPTION_ADMIN |
啟用二進位日誌加密的啟用和停用。層級:全域。 |
CLONE_ADMIN |
啟用複製管理。層級:全域。 |
CONNECTION_ADMIN |
啟用連線限制/限制控制。層級:全域。 |
ENCRYPTION_KEY_ADMIN |
啟用 InnoDB 金鑰輪換。層級:全域。 |
FIREWALL_ADMIN |
啟用防火牆規則管理,任何使用者。層級:全域。 |
FIREWALL_EXEMPT |
豁免使用者受防火牆限制。層級:全域。 |
FIREWALL_USER |
啟用防火牆規則管理,自行。層級:全域。 |
FLUSH_OPTIMIZER_COSTS |
啟用最佳化工具成本重新載入。層級:全域。 |
FLUSH_STATUS |
啟用狀態指示器清除。層級:全域。 |
FLUSH_TABLES |
啟用資料表清除。層級:全域。 |
FLUSH_USER_RESOURCES |
啟用使用者資源清除。層級:全域。 |
GROUP_REPLICATION_ADMIN |
啟用群組複寫控制。層級:全域。 |
INNODB_REDO_LOG_ARCHIVE |
啟用重做日誌封存管理。層級:全域。 |
INNODB_REDO_LOG_ENABLE |
啟用或停用重做日誌記錄。層級:全域。 |
NDB_STORED_USER |
啟用 SQL 節點之間的使用者或角色共用(NDB 叢集)。層級:全域。 |
PASSWORDLESS_USER_ADMIN |
啟用無密碼使用者帳戶管理。層級:全域。 |
PERSIST_RO_VARIABLES_ADMIN |
啟用持續性唯讀系統變數。層級:全域。 |
REPLICATION_APPLIER |
作為複寫通道的 PRIVILEGE_CHECKS_USER 。層級:全域。 |
REPLICATION_SLAVE_ADMIN |
啟用常規複寫控制。層級:全域。 |
RESOURCE_GROUP_ADMIN |
啟用資源群組管理。層級:全域。 |
RESOURCE_GROUP_USER |
啟用資源群組管理。層級:全域。 |
ROLE_ADMIN |
啟用角色的授予或撤銷、WITH ADMIN OPTION 的使用。層級:全域。 |
SESSION_VARIABLES_ADMIN |
啟用設定受限工作階段系統變數。層級:全域。 |
SHOW_ROUTINE |
啟用對儲存常式定義的存取。層級:全域。 |
SKIP_QUERY_REWRITE |
不重寫此使用者執行的查詢。層級:全域。 |
SYSTEM_USER |
將帳戶指定為系統帳戶。層級:全域。 |
SYSTEM_VARIABLES_ADMIN |
啟用修改或持久化全域系統變數。層級:全域。 |
TABLE_ENCRYPTION_ADMIN |
啟用覆寫預設加密設定。層級:全域。 |
TELEMETRY_LOG_ADMIN |
啟用適用於 AWS 上 HeatWave 的遙測日誌組態。層級:全域。 |
TP_CONNECTION_ADMIN |
啟用執行緒集區連線管理。層級:全域。 |
VERSION_TOKEN_ADMIN |
啟用版本權杖功能的使用。層級:全域。 |
XA_RECOVER_ADMIN |
啟用 XA RECOVER 執行。層級:全域。 |
觸發器與資料表相關聯。若要建立或刪除觸發器,您必須擁有該資料表的 TRIGGER
權限,而不是針對觸發器本身。
在 GRANT
陳述式中,ALL [PRIVILEGES]
或 PROXY
權限必須單獨指定,不能與其他權限一同指定。ALL [PRIVILEGES]
代表在授與權限的層級上可用的所有權限,但不包括 GRANT OPTION
和 PROXY
權限。
MySQL 帳戶資訊儲存在 mysql
系統綱要的資料表中。如需更多詳細資訊,請參閱第 8.2 節「存取控制和帳戶管理」,其中詳細討論了 mysql
系統綱要和存取控制系統。
如果授權表包含混合大小寫的資料庫或資料表名稱的權限列,且 lower_case_table_names
系統變數設定為非零值,則無法使用 REVOKE
來撤銷這些權限。在這種情況下,必須直接操作授權表。(當 lower_case_table_names
設定時,GRANT
不會建立此類列,但可能在設定該變數之前已建立此類列。lower_case_table_names
設定只能在伺服器啟動時配置。)
權限可以根據 ON
子句使用的語法,在多個層級授與。對於 REVOKE
,相同的 ON
語法會指定要移除哪些權限。
對於全域、資料庫、資料表和常式層級,GRANT ALL
僅會指派您正在授與的層級上存在的權限。例如,GRANT ALL ON
是資料庫層級的陳述式,因此它不會授與任何僅限全域的權限,例如 db_name
.*FILE
。授與 ALL
不會指派 GRANT OPTION
或 PROXY
權限。
如果存在 object_type
子句,則當後面的物件是資料表、預存函數或預存程序時,應將其指定為 TABLE
、FUNCTION
或 PROCEDURE
。
使用者對資料庫、資料表、資料行或常式所持有的權限是以累加的方式形成,即各權限層級(包括全域層級)的帳戶權限的邏輯 OR
。不可能透過在較低層級缺少該權限來拒絕在較高層級授與的權限。例如,以下陳述式在全域範圍內授與 SELECT
和 INSERT
權限
GRANT SELECT, INSERT ON *.* TO u1;
全域授與的權限適用於所有資料庫、資料表和資料行,即使這些權限未在任何較低層級授與。
如果啟用 partial_revokes
系統變數,則可以透過撤銷特定資料庫的全域層級授與的權限來明確拒絕該權限
GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;
前面陳述式的結果是,SELECT
全域適用於所有資料表,而 INSERT
和 UPDATE
全域適用,但不適用於 db1
中的資料表。帳戶對 db1
的存取是唯讀的。
權限檢查程序的詳細資訊請參閱 第 8.2.7 節「存取控制,階段 2:請求驗證」。
如果您為任何一個使用者使用資料表、資料行或常式權限,則伺服器會檢查所有使用者的資料表、資料行和常式權限,這會稍微減慢 MySQL 的速度。同樣地,如果您限制任何使用者的查詢、更新或連線數量,則伺服器必須監控這些值。
MySQL 允許您授與對不存在的資料庫或資料表的權限。對於資料表,要授與的權限必須包括 CREATE
權限。此行為是經過設計的,旨在讓資料庫管理員能夠為稍後要建立的資料庫或資料表準備使用者帳戶和權限。
當您刪除資料庫或資料表時,MySQL 不會自動撤銷任何權限。但是,如果您刪除常式,則會撤銷為該常式授與的任何常式層級權限。
全域權限是管理權限,或適用於指定伺服器上的所有資料庫。若要指派全域權限,請使用 ON *.*
語法
GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
CREATE TABLESPACE
、CREATE USER
、FILE
、PROCESS
、RELOAD
、REPLICATION CLIENT
、REPLICATION SLAVE
、SHOW DATABASES
、SHUTDOWN
和 SUPER
靜態權限是管理權限,只能全域授與。
動態權限都是全域的,只能全域授與。
其他權限可以全域授與,也可以在更特定的層級授與。
在全域層級授與的 GRANT OPTION
的效果對於靜態和動態權限有所不同
為任何靜態全域權限授與的
GRANT OPTION
適用於所有靜態全域權限。為任何動態權限授與的
GRANT OPTION
僅適用於該動態權限。
在全域層級的 GRANT ALL
會授與所有靜態全域權限和目前所有已註冊的動態權限。在執行 GRANT
陳述式之後註冊的動態權限不會追溯授與任何帳戶。
MySQL 將全域權限儲存在 mysql.user
系統表中。
資料庫權限適用於指定資料庫中的所有物件。若要指派資料庫層級權限,請使用 ON
語法db_name
.*
GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
如果您使用 ON *
語法(而不是 ON *.*
),則會在預設資料庫的資料庫層級指派權限。如果沒有預設資料庫,則會發生錯誤。
CREATE
、DROP
、EVENT
、GRANT OPTION
、LOCK TABLES
和 REFERENCES
權限可以在資料庫層級指定。資料表或常式權限也可以在資料庫層級指定,在這種情況下,它們適用於資料庫中的所有資料表或常式。
MySQL 將資料庫權限儲存在 mysql.db
系統表中。
資料表權限適用於指定資料表中的所有資料行。若要指派資料表層級權限,請使用 ON
語法db_name.tbl_name
GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
如果您指定 tbl_name
而不是 db_name.tbl_name
,則該陳述式會適用於預設資料庫中的 tbl_name
。如果沒有預設資料庫,則會發生錯誤。
資料表層級允許的 priv_type
值為 ALTER
、CREATE VIEW
、CREATE
、DELETE
、DROP
、GRANT OPTION
、INDEX
、INSERT
、REFERENCES
、SELECT
、SHOW VIEW
、TRIGGER
和 UPDATE
。
資料表層級的權限適用於基本資料表和檢視表。它們不適用於使用 CREATE TEMPORARY TABLE
建立的資料表,即使資料表名稱相符。有關 TEMPORARY
資料表權限的資訊,請參閱 第 15.1.20.2 節「CREATE TEMPORARY TABLE 陳述式」。
MySQL 將資料表權限儲存在 mysql.tables_priv
系統表中。
資料行權限適用於指定資料表中的單個資料行。要在資料行層級授與的每個權限,後面都必須跟著資料行或多個資料行,並以括號括起來。
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
資料行允許的 priv_type
值(也就是說,當您使用 column_list
子句時)為 INSERT
、REFERENCES
、SELECT
和 UPDATE
。
MySQL 將資料行權限儲存在 mysql.columns_priv
系統表中。
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';
GRANT 'u1' TO 'u1'; -- simple loop: u1 => u1
GRANT 'r1' TO 'r1'; -- simple loop: r1 => r1
GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2'; -- mixed user/role loop: u2 => r2 => u2
CREATE USER u1;
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u1;
REVOKE INSERT, UPDATE ON schema1.* FROM u1;
REVOKE SELECT ON schema2.* FROM u1;
CREATE ROLE r1;
GRANT INSERT ON schema1.* TO r1;
GRANT SELECT ON schema2.* TO r1;
GRANT r1 TO u1;
mysql> CREATE USER u2; mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u2; mysql> SHOW GRANTS FOR u2; +-------------------------------------------------+ | Grants for u2@% | +-------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` | +-------------------------------------------------+
mysql> CREATE USER u3; mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u3 AS u1; mysql> SHOW GRANTS FOR u3; +----------------------------------------------------+ | Grants for u3@% | +----------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%` | | REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` | | REVOKE SELECT ON `schema2`.* FROM `u3`@`%` | +----------------------------------------------------+
mysql> CREATE USER u4; mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1; mysql> SHOW GRANTS FOR u4; +-------------------------------------------------+ | Grants for u4@% | +-------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE ON *.* TO `u4`@`%` | | REVOKE UPDATE ON `schema1`.* FROM `u4`@`%` | +-------------------------------------------------+
GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;
請注意,當您在特定的權限層級授予使用者 GRANT OPTION
權限時,該使用者在該層級所擁有的任何權限(或未來可能被授予的權限)也可以由該使用者授予其他使用者。假設您授予使用者在資料庫上的 INSERT
權限。如果您接著在該資料庫上授予 SELECT
權限,並指定 WITH GRANT OPTION
,該使用者不僅可以將 SELECT
權限授予其他使用者,還可以授予 INSERT
權限。如果您接著在該資料庫上授予使用者 UPDATE
權限,該使用者可以授予 INSERT
、SELECT
和 UPDATE
權限。
對於非管理員使用者,您不應在全域或針對 mysql
系統綱要授予 ALTER
權限。如果您這樣做,該使用者可能會嘗試透過重新命名表格來破壞權限系統!
有關特定權限相關安全風險的更多資訊,請參閱 章節 8.2.2, “MySQL 提供的權限”。
MySQL 和標準 SQL 版本的 GRANT
之間最大的差異在於
MySQL 將權限與主機名稱和使用者名稱的組合相關聯,而不僅僅是與使用者名稱相關聯。
標準 SQL 沒有全域或資料庫層級的權限,也不支援 MySQL 支援的所有權限類型。
MySQL 不支援標準 SQL 的
UNDER
權限。標準 SQL 權限以階層方式組織。如果您移除使用者,則該使用者已被授予的所有權限都將被撤銷。如果您使用
DROP USER
,這在 MySQL 中也是如此。請參閱 章節 15.7.1.5,“DROP USER 語法”。在標準 SQL 中,當您刪除表格時,該表格的所有權限都會被撤銷。在標準 SQL 中,當您撤銷權限時,基於該權限授予的所有權限也會被撤銷。在 MySQL 中,可以使用
DROP USER
或REVOKE
語法來撤銷權限。在 MySQL 中,可以僅針對表格中的某些欄位擁有
INSERT
權限。在這種情況下,您仍然可以在該表格上執行INSERT
語法,前提是您僅針對您擁有INSERT
權限的那些欄位插入值。如果未啟用嚴格 SQL 模式,則省略的欄位將設定為其隱含的預設值。在嚴格模式下,如果任何省略的欄位沒有預設值,則會拒絕該語法。(標準 SQL 要求您在所有欄位上都擁有INSERT
權限。)有關嚴格 SQL 模式和隱含預設值的資訊,請參閱 章節 7.1.11,“伺服器 SQL 模式” 和 章節 13.6,“資料類型預設值”。