GRANTpriv_type[(column_list)] [,priv_type[(column_list)]] ...
ON [object_type] {tbl_name| * | *.* |db_name.*}
TOuser[IDENTIFIED BY [PASSWORD] 'passWord']
[,user[IDENTIFIED BY [PASSWORD] 'passWord']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITHwith_option[with_option] ...]object_type=
TABLE
| FUNCTION
| PROCEDUREwith_option=
GRANT OPTION
| MAX_QUERIES_PER_HOURcount| MAX_UPDATES_PER_HOURcount| MAX_CONNECTIONS_PER_HOURcount| MAX_USER_CONNECTIONScount REVOKEpriv_type[(column_list)] [,priv_type[(column_list)]] ...
ON [object_type] {tbl_name| * | *.* |db_name.*}
FROMuser[,user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROMuser[,user] ... GRANT和REVOKE語句允許系統管理員創建MySQL用戶 賬戶,授予權限和撤銷權限。 MySQL賬戶信息存儲在mysql數據庫的表中。在第5章:數據庫管理中對本數據庫和訪問控制系統進行了詳盡的討論。要了解更多詳細信息,您應該查詢此章。如果授權表擁有含有mixed-case數據庫或表名稱的權限記錄,並且lower_case_table_names系統變量已設置,則不能使用REVOKE撤銷權限,必須直接操縱授權表。(當lower_case_table_names已設置時,GRANT將不會創建此類記錄,但是此類記錄可能已經在設置變量之前被創建了。)授予的權限可以分為多個層級:・ 全局層級全局權限適用於一個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤銷全局權限。・ 數據庫層級數據庫權限適用於一個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ONdb_name.*和REVOKE ALL ONdb_name.*只授予和撤銷數據庫權限。・ 表層級表權限適用於一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ONdb_name.tbl_name和REVOKE ALL ONdb_name.tbl_name只授予和撤銷表權限。・ 列層級列權限適用於一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。・ 子程序層級 CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予為全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予為子程序層級,並存儲在mysql.procs_priv表中。當後續目標是一個表、一個已存儲的函數或一個已存儲的過程時,object_type子句應被指定為TABLE、FUNCTION或PROCEDURE。當從舊版本的MySQL升級時,要使用本子句,您必須升級您的授權表。請參見2.10.2節,“升級授權表”。要使用GRANT或REVOKE,您必須擁有GRANT OPTION權限,並且您必須用於您正在授予或撤銷的權限。要撤銷所有權限,需使用以下語法。此語法用於取消對於已命名的用戶的所有全局層級、數據庫層級、表層級和列層級的權限。 REVOKE ALL PRIVILEGES, GRANT OPTION FROMuser[,user] ... 要使用本REVOKE語法,您必須擁有MySQL數據庫的全局CREATE USER權限或UPDATE權限。對於GRANT和REVOKE語句,priv_type可以被指定為以下任何一種:權限
意義 ALL [PRIVILEGES]
設置除GRANT OPTION之外的所有簡單權限 ALTER
允許使用ALTER TABLE ALTER ROUTINE
更改或取消已存儲的子程序 CREATE
允許使用CREATE TABLE CREATE ROUTINE
創建已存儲的子程序 CREATE TEMPORARY TABLES
允許使用CREATE TEMPORARY TABLE CREATE USER
允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 CREATE VIEW
允許使用CREATE VIEW DELETE
允許使用DELETE DROP
允許使用DROP TABLE EXECUTE
允許用戶運行已存儲的子程序 FILE
允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE INDEX
允許使用CREATE INDEX和DROP INDEX INSERT
允許使用INSERT LOCK TABLES
允許對您擁有SELECT權限的表使用LOCK TABLES PROCESS
允許使用SHOW FULL PROCESSLIST REFERENCES
未被實施 RELOAD
允許使用FLUSH REPLICATION CLIENT
允許用戶詢問從屬服務器或主服務器的地址 REPLICATION SLAVE
用於復制型從屬服務器(從主服務器中讀取二進制日志事件) SELECT
允許使用SELECT SHOW DATABASES
SHOW DATABASES顯示所有數據庫 SHOW VIEW
允許使用SHOW CREATE VIEW SHUTDOWN
允許使用MySQLadmin shutdown SUPER
允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,MySQLadmin debug命令;允許您連接(一次),即使已達到max_connections。 UPDATE
允許使用UPDATE USAGE
“無權限”的同義詞 GRANT OPTION
允許授予權限當從舊版本的MySQL升級時,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE權限,您必須首先升級您的授權表。請參見2.10.2節,“升級授權表”。 REFERENCES權限目前未被使用。當您想要創建一個沒有權限的用戶時,可以指定USAGE。使用SHOW GRANTS來確定帳戶擁有什麼權限。請參見13.5.4.10節,“SHOW GRANTS語法”。您可以通過使用ON *.*語法賦予全局權限,或通過使用ONdb_name.*語法賦予數據庫層級權限。如果您指定了ON *並且您已經選擇了一個默認數據庫,則權限被賦予到這個數據庫中。(警告:如果您指定了ON *同時您沒有選擇一個默認數據庫,則權限是全局的。) FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN和SUPER權限是管理性權限,只能進行全局授權(使用ON *.*語法)。其它權限可以被全局授權,或被賦予為其它層級。對於一個表,您可以指定的priv_type值只能是SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX和ALTER。對於一個列(也就是,當您使用一個column_list子句時),您可以指定的priv_type值只能是SELECT, INSERT和UPDATE。在子程序層級,您可以指定的priv_type值只能是ALTER ROUTINE, EXECUTE和GRANT OPTION。CREATE ROUTINE不是一個子程序層級的權限,因為您必須擁有此權限,才能創建一個子程序。對於全局、數據庫、表和子程序層級,GRANT ALL只能賦予在您正在授權的層級中存在的權限。例如,如果您使用GRANT ALL ONdb_name.*,這是一個數據庫層級語句,因此不會授予全局權限,如FILE等。 MySQL允許您對不存在的數據庫目標授予權限。在此情況下,將被授予的權限必須包括CREATE權限。這個性質是有意設計的,目的是允許數據庫管理員為將在此後被創建的數據庫目標預備用戶 賬戶和權限。要點:當您取消一個表或數據庫時,MySQL不會自動撤銷任何權限。但是,如果您取消一個子程序,則被賦予該子程序的所有子程序層級的權限都被撤銷。注意:GRANT語句用於在全局層級或數據庫層級賦予權限。當在GRANT語句中指定數據庫名稱時,允許使用‘_’和‘%’通配符。這意味著,如果您想要使用‘_’字符作為一個數據庫名稱的一部分,您應該在GRANT語句中指定它為‘\_’,以防止用戶可以訪問其它符合此通配符格式的數據庫;例如,GRANT ... ON `foo\_bar`.* TO ...。為了接納對來自任意主機的用戶授權的權利,MySQL支持以user_name@host_name的形式指定user值。如果一個user_name或host_name與一個不加引號的標識符一樣是合法的,那麼您不需要對它加引號。不過,要指定一個包含特殊字符(如‘-’)的user_name字符串,或一個包含特殊字符或通配字符(如‘%’),則引號是必要的;例如,'test-user'@'test-hostname'。分別對username和hostname加引號。您可以在hostname中指定通配符。例如user_name@'%.loc.gov'適用於在loc.gov域中的任何主機的user_name。同時user_name@'144.155.166.%'適用於144.155.166 C級子網中的任何主機的user_name。簡單形式user_name是user_name@'%'的同義詞。 MySQL不支持usernames中的通配符。通過把帶有User=''的登錄項插入到mysql.user表中,或通過使用GRANT語句創建一個帶有空名稱的用戶,可以定義匿名用戶: mysql>GRANT ALL ON test.* TO ''@'localhost' ... 當把帶引號的值是,需使用反勾號(‘`’)為數據庫、表、列和子程序名稱加引號。使用單引號(‘'’)為hostnames、usernames和 密碼加引號。警告:如果您允許匿名用戶連接到MySQL服務器,則您應該同時向所有本地用戶授予user_name@localhost權限。否則,當有名稱的用戶試圖從本地機器登錄MySQL服務器時,mysql.user表中的用於localhost的匿名用戶帳戶會被使用。您可以通過執行以下查詢來確定是否這適合於您。以下查詢列舉了所有匿名用戶: mysql>SELECT Host, User FROM mysql.user WHERE User=''; 如果您想要刪除本地匿名用戶賬戶,以避免出現剛才談到的問題,則需使用以下語句: mysql>DELETE FROM mysql.user WHERE Host='localhost' AND User=''; mysql>FLUSH PRIVILEGES; GRANT支持最長為60個字符的hostnames。數據庫、表、列和子程序名稱最長可為64個字符。Usernames最長可為16個字符。 注釋:不能通過更改mysql.user表來改變usernames的允許長度。如果試圖這麼做,會導致出現不可預見的問題,可能會造成用戶無法登錄MySQL服務器。除了采用由MySQL公司提供的用於升級MySQL服務器的mysql_fix_privilege_tables原稿之外,請您不要以任何方式變更授權表。對於表或列的權限是作為各個權限層級的邏輯OR權限被附加形成的。例如,如果mysql.user表指定一個用戶擁有全局SELECT權限,則該權限不能被數據庫、表或列層級的登錄項定義。可以按下列方法計算列權限: global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges 在多數情況下,您只在一個權限層級下向用戶授予權利,所以壽命通常不是那麼復雜。有關權限檢查規程的細節,請參見5.7節,“MySQL訪問權限系統”。如果您對一個在mysql.user表中不存在的username/hostname組合授予權限,則增加一個登錄項並保持在此處,直到使用DELETE語句刪除為止。換句話說,GRANT可以創建用戶表登錄項,但是REVOKE不會取消它們;您必須使用DROP USER或DELETE明確地操作。如果創建了一個新的用戶,或者如果您擁有全局授權權限,則用戶密碼被設置為由IDENTIFIED BY子句指定的密碼(如果給定了一個)。如果用戶已擁有了一個密碼,則此密碼被新密碼替代。警告:如果您創建了一個新用戶,但是不指定IDENTIFIED BY子句,則用戶沒有 密碼。這是很不安全的。不過,您可以啟用NO_AUTO_CREATE_USER SQL模式,來防止GRANT創建一個新用戶(否則GRANT會這麼做),除非給定了IDENTIFIED BY來為新用戶提供一個密碼。使用SET PASSWORD語句也可以設置密碼。請參見13.5.1.5節,“SET PASSWORD語法”。在IDENTIFIED BY子句中,密碼應被作為文字密碼只被給定。沒有必要使用PASSWORD()函數,因為該函數用於SET PASSWORD語句。例如: GRANT ... IDENTIFIED BY 'mypass'; 如果您不想以明白的文字發送密碼,並且您知道PASSWORD()返回給密碼的混編值,則您可以指定混編值,前面加入關鍵詞PASSWORD: GRANT ... IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'; 在一個C程序中,您可以通過使用make_scrambled_passWord()C API函數得到混編值。如果您為一個數據庫授予權限,則在mysql.db表中,會根據需要創建登錄項。如果使用REVOKE刪除了所有的數據庫權限,則本登錄項被刪除。如果一個用戶不擁有表權限,則當用戶申請表清單時(例如,使用SHOW TABLES語句),表名稱不顯示。 SHOW DATABASES權限允許賬戶通過發布SHOW DATABASE語句來觀看數據名稱。不擁有此權限的賬戶只能看到他們擁有部分權限的數據庫,並且如果使用--skip-show-database選項啟動服務器,則根本不能使用本語句。 WITH GRANT OPTION子句給予用戶能力,可以在指定的權限層級,向其它用戶給定其擁有的任何權限。您應該留心您給予了誰GRANT OPTION權限,因為擁有不同權限的兩個用戶可以聯合使用權限!您不能向其它用戶授予您自己沒有的權限;GRANT OPTION權限只允許您賦予您自己擁有的權限。要注意,當您在某個特定權限層級向一個用戶授予GRANT OPTION權限時,用戶擁有的該層級的任何權限(或未來將被給定的權限)也可以由該用戶授予。假設您向一個用戶賦予了數據庫INSERT權限。如果您然後賦予數據庫SELECT權限,並指定了WITH GRANT OPTION,則該用戶不僅可以向其它用戶給予SELECT權限,還可以給予INSERT。如果您然後向用戶授予數據庫UPDATE權限,則用戶可以授予INSERT, SELECT和UPDATE。您不應該向一個常規用戶授予ALTER權限。如果您這麼做,則該用戶可以嘗試通過對表重新命名來破壞授權系統! TheMAX_QUERIES_PER_HOURcount,MAX_UPDATES_PER_HOURcount, andMAX_CONNECTIONS_PER_HOURcountoptions limit the number of queries, updates, and logins a user can perform during any given one-hour period. Ifcountis0(the default), this means that there is no limitation for that user. MAX_QUERIES_PER_HOURcount,MAX_UPDATES_PER_HOURcount和MAX_CONNECTIONS_PER_HOURcount選項限制了在任何給定的一小時期間,用戶可以執行的查詢、更新和登錄的數目。如果count是0(默認值),這意味著,對該用戶沒有限制。 MAX_USER_CONNECTIONScount選項限制了賬戶可以同時進行的連接的最大數目。如果count是0(默認值),則max_user_connections系統可以決定該 賬戶同時連接的數目。注釋:要對一個原有的用戶指定任何這類資源限制型選項,同時又不影響原有的權限,需使用GRANT USAGE ON *.* ... WITH MAX_...。見5.8.4節,“限制賬戶資源”。除了根據username和密碼進行常規鑒定外,MySQL還可以檢查X509證明屬性。要為MySQL賬戶指定與SSL有關的選項,需使用GRANT語句的REQUIRE子句。(要了解有關在MySQL中使用SSL的背景信息,請參見5.8.7節,“使用安全連接”。)對於一個給定的賬戶,有多種可能性可以限制連接類型:・ 如果賬戶沒有SSL或X509要求,並且如果username和 密碼是有效的,則允許不加密連接。但是,如果客戶端有正確的證明和關鍵文件,則根據客戶端的選擇,也可以使用加密連接。・ REQUIRE SSL選項用於告知服務器,對於該賬戶只允許SSL加密連接。注意,如果有允許任何非SSL連接的訪問控制記錄,則本選項可以被忽略。・ mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ・ ->IDENTIFIED BY 'goodsecret' REQUIRE SSL; ・ REQUIRE X509意味著客戶端必須擁有一個有效證明,除非不需要確切的證明、發布者和主題。唯一的要求是,應可以使用CA證明其中之一來驗證簽名。・ mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ・ ->IDENTIFIED BY 'goodsecret' REQUIRE X509; ・ REQUIRE ISSUER 'issuer'用於對連接嘗試進行限定,客戶端必須出示一個由CA’issuer’發布的有效的X509證明。如果客戶端出示的證明是有效的,但是有一個不同的發布者,則服務器會拒絕連接。使用X509證明就意味著要加密,所以在這種情況下,SSL選項是不必要的。・ mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ・ ->IDENTIFIED BY 'goodsecret' ・ ->REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/ ・ O=MySQL Finland AB/CN=Tonu Samuel/
[email protected]'; 注意,ISSUER值應被作為一個單一字符串輸入。・ REQUIRE SUBJECT 'subject'用於對連接嘗試進行限定,客戶端必須出示一個包含主題subject的有效的X509證明。如果客戶端出示的證明是有效的,但是有一個不同的主題,則服務器會拒絕連接。・ mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ・ ->IDENTIFIED BY 'goodsecret' ・ ->REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/ ・ O=MySQL demo client certificate/ ・ CN=Tonu Samuel/
[email protected]'; 注意,SUBJECT值應被作為一個單一字符串輸入。・ 需要REQUIRE CIPHER 'cipher'來確認使用了密碼和足夠長度的關鍵字。如果使用了采用短型加密關鍵字的舊算法,SSL本身會比較脆弱。使用本選項,您可以要求使用特定的密碼方法來許可一個連接。・ mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ・ ->IDENTIFIED BY 'goodsecret' ・ ->REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'; SUBJECT, ISSUER和CIPHER選項可以在REQUIRE子句中結合,如下: mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' ->IDENTIFIED BY 'goodsecret' ->REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/ O=MySQL demo clIEnt certificate/ CN=Tonu Samuel/
[email protected]' ->AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/
[email protected]' ->AND CIPHER 'EDH-RSA-DES-CBC3-SHA'; 注意,SUBJECT和ISSUER值各自應被作為一個單一字符串輸入。在REQUIRE各選項之間,AND關鍵詞是自選的。選項的順序無所謂,但是選項不能被指定兩次。當mysqld啟動後,所有的權限被讀入存儲器中。要了解詳細說明,請參見5.7.7節,“權限更改何時生效”。注意,如果您正在使用表權限或列權限,即使只對一個用戶使用,服務器也會對所有用戶檢查表權限和列權限,這會略微降低MySQL的速度。與此類似,如果您對某些用戶限制查詢、更新或連接的數目,則服務器必須監測這些值。標准SQL版本和MySQL版本的GRANT之間的最大區別是:・ 在MySQL中,權限與hostname和username的組合有關,與 單一的username無關。・ 標准SQL不擁有全局層級或數據庫層級權限,也不支持MySQL支持的所有權限類型。・ MySQL不支持標准SQL TRIGGER或UNDER權限。・ 標准SQL權限以一種分等級的方式進行組織。如果您取消一個用戶,則用戶被授予的所有權限都被撤銷。在MySQL中,如果您使用DROP USER,也會如此。請參見13.5.1.2節,“DROP USER語法”。・ 在標准SQL中,當您取消一個表時,對一個表的所有權限會被撤銷。在標准SQL中,當您撤銷一個權限時,根據該權限被授予的所有權限也會被撤銷。在MySQL中,只有使用明確的REVOKE語句,或通過操作存儲在MySQL授權表中的值,才能取消權限。・ 在MySQL中,可以只對一個表中的部分列擁有INSERT權限。在此情況下,如果您忽略您不擁有INSERT權限的那些列,,您仍然可以對表執行INSERT語句。如果沒有啟用嚴格的SQL模式,則被忽略的列被設置為各自隱含的默認值。在嚴格模式下,如果某個被忽略的列沒有默認值,則該語句被拒絕。5.3.2節,“SQL服務器模式”對嚴格模式進行了討論。13.1.5節,“CREATE TABLE語法”對隱含默認值進行了討論。您不擁有INSERT權限的列被設置為各自的默認值。標准SQL要求您擁有所有列的INSERT權限。在MySQL中,如果您只擁有一個表中的部分列的INSERT權限,同時,如果您從INSERT語句中忽略您不擁有權限的列,則您仍然可以對表執行INSERT語句;那些列將被設置為各自的默認值。在嚴格模式下(即當sql_mode='traditional'時,如果某些被忽略的列沒有默認值,則INSERT語句將被拒絕。