文章目錄 【 1. 權限表 】 1.1 user 權限表 1.1.1 用戶列 1.1.2 權限列 1.1.3 安全列 1.1.4 資源控制列 1.2 db 表 1.3 tables_priv 表 1.4 columns_priv 表 1.5 procs_priv表 【 2. 用戶管理 】 2.1 創建用戶 CREATE USER 2.2 用戶的登陸、退出 2.3 重命名用戶 RENAME USER 2.4 刪除用戶 DROP/DELETE USER DROP USER 刪除普通用戶 DELETE 刪除普通用戶 2.5 查看用戶權限 2.6 用戶授權 GRANT 2.6.1 數據庫的權限類型 2.6.2 表的權限類型 2.6.3 列的權限類型 2.6.4 用戶的權限類型 2.6 刪除用戶權限 REVOKE 2.8 修改用戶密碼
問題背景 MySQL 是一個多用戶數據庫,具有功能強大的訪問控制系統,可以為不同用戶指定不同權限。在前面的章節中我們使用的 root 用戶是超級管理員,擁有所有權限,包括創建用戶、刪除用戶和修改用戶密碼等管理權限。而為了實際項目的需要,可以創建擁有不同權限的普通用戶。
【 1. 權限表 】
MySQL 在安裝時會自動創建一個名為 mysql 的數據庫,mysql 數據庫中存儲的都是 用戶權限表 :用戶登錄以后,MySQL 會根據這些權限表的內容為每個用戶賦予相應的權限 。
1.1 user 權限表
user 表 是 MySQL 中最重要的一個權限表,用來 記錄允許連接到服務器的賬號信息 ,在 user 表里啟用的所有權限都是全局級的,適用于所有數據庫 。顯示 user 權限表
DESC mysql. user ;
1.1.1 用戶列
用戶列 存儲了用戶連接 MySQL 數據庫時需要輸入的信息 。 MySQL 5.7 版本不再使用 Password 來作為密碼的字段,而改成了 authentication_string。user 表的用戶列 用戶登錄時,如果這 3 個字段同時匹配,MySQL 數據庫系統才會允許其登錄。創建新用戶時,也是設置這 3 個字段的值;修改用戶密碼時,實際就是修改 user 表的 authentication_string 字段的值。
字段名 說明 字段類型 是否為空 默認值 Host 主機名 char(60) NO 無 User 用戶名 char(32) NO 無 authentication_string 密碼 text YES 無
1.1.2 權限列
權限列 的字段決定了用戶的權限 ,用來描述在全局范圍內允許對數據和數據庫進行的操作。權限大致分為兩大類,分別是高級管理權限和普通權限: 高級管理權限 主要對數據庫進行管理。 例如關閉服務的權限、超級權限和加載用戶等;普通權限 主要操作數據庫。 例如查詢權限、修改權限等。 user表的權限列 user 表的權限列包括 Select_priv、Insert_ priv 等以 priv 結尾的字段,這些字段值的數據類型為 ENUM,可取的值只有 Y 和 N:Y 表示該用戶有對應的權限,N 表示該用戶沒有對應的權限。從安全角度考慮,這些字段的默認值都為 N。
字段名 字段類型 是否為空 默認值 說明 Select_priv enum(‘N’,‘Y’) NO N 是否可以通過SELECT 命令查詢數據 Insert_priv enum(‘N’,‘Y’) NO N 是否可以通過 INSERT 命令插入數據 Update_priv enum(‘N’,‘Y’) NO N 是否可以通過UPDATE 命令修改現有數據 Delete_priv enum(‘N’,‘Y’) NO N 是否可以通過DELETE 命令刪除現有數據 Create_priv enum(‘N’,‘Y’) NO N 是否可以創建新的數據庫和表 Drop_priv enum(‘N’,‘Y’) NO N 是否可以刪除現有數據庫和表 Reload_priv enum(‘N’,‘Y’) NO N 是否可以執行刷新和重新加載MySQL所用的各種內部緩存的特定命令,包括日志、權限、主機、查詢和表 Shutdown_priv enum(‘N’,‘Y’) NO N 是否可以關閉MySQL服務器。將此權限提供給root賬戶之外的任何用戶時,都應當非常謹慎 Process_priv enum(‘N’,‘Y’) NO N 是否可以通過SHOW PROCESSLIST命令查看其他用戶的進程 File_priv enum(‘N’,‘Y’) NO N 是否可以執行SELECT INTO OUTFILE和LOAD DATA INFILE命令 Grant_priv enum(‘N’,‘Y’) NO N 是否可以將自己的權限再授予其他用戶 References_priv enum(‘N’,‘Y’) NO N 是否可以創建外鍵約束 Index_priv enum(‘N’,‘Y’) NO N 是否可以對索引進行增刪查 Alter_priv enum(‘N’,‘Y’) NO N 是否可以重命名和修改表結構 Show_db_priv enum(‘N’,‘Y’) NO N 是否可以查看服務器上所有數據庫的名字,包括用戶擁有足夠訪問權限的數據庫 Super_priv enum(‘N’,‘Y’) NO N 是否可以執行某些強大的管理功能,例如通過KILL命令刪除用戶進程;使用SET GLOBAL命令修改全局MySQL變量,執行關于復制和日志的各種命令。(超級權限) Create_tmp_table_priv enum(‘N’,‘Y’) NO N 是否可以創建臨時表 Lock_tables_priv enum(‘N’,‘Y’) NO N 是否可以使用LOCK TABLES命令阻止對表的訪問/修改 Execute_priv enum(‘N’,‘Y’) NO N 是否可以執行存儲過程 Repl_slave_priv enum(‘N’,‘Y’) NO N 是否可以讀取用于維護復制數據庫環境的二進制日志文件 Repl_client_priv enum(‘N’,‘Y’) NO N 是否可以確定復制從服務器和主服務器的位置 Create_view_priv enum(‘N’,‘Y’) NO N 是否可以創建視圖 Show_view_priv enum(‘N’,‘Y’) NO N 是否可以查看視圖 Create_routine_priv enum(‘N’,‘Y’) NO N 是否可以更改或放棄存儲過程和函數 Alter_routine_priv enum(‘N’,‘Y’) NO N 是否可以修改或刪除存儲函數及函數 Create_user_priv enum(‘N’,‘Y’) NO N 是否可以執行CREATE USER命令,這個命令用于創建新的MySQL賬戶 Event_priv enum(‘N’,‘Y’) NO N 是否可以創建、修改和刪除事件 Trigger_priv enum(‘N’,‘Y’) NO N 是否可以創建和刪除觸發器 Create_tablespace_priv enum(‘N’,‘Y’) NO N 是否可以創建表空間
1.1.3 安全列
字段名 字段類型 是否為空 默認值 說明 ssl_type enum(‘’,‘ANY’,‘X509’,‘SPECIFIED’) NO 支持ssl標準加密安全字段 ssl_cipher blob NO 支持ssl標準加密安全字段 x509_issuer blob NO 支持x509標準字段 x509_subject blob NO 支持x509標準字段 plugin char(64) NO mysql_native_password 引入plugins以進行用戶連接時的密碼驗證,plugin創建外部/代理用戶 password_expired enum(‘N’,‘Y’) NO N 密碼是否過期 (N 未過期,y 已過期) password_last_changed timestamp YES 記錄密碼最近修改的時間 password_lifetime smallint(5) unsigned YES 設置密碼的有效時間,單位為天數 account_locked enum(‘N’,‘Y’) NO N 用戶是否被鎖定(Y 鎖定,N 未鎖定)
1.1.4 資源控制列
資源控制列 的字段用來 限制用戶使用的資源 。user 表中的資源控制列。 以下字段的默認值為 0,表示沒有限制。 一個小時內用戶查詢或者連接數量超過資源控制限制,用戶將被鎖定 ,直到下一個小時才可以在此執行對應的操作。可以使用 GRANT 語句更新這些字段的值。
字段名 字段類型 是否為空 默認值 說明 max_questions int(11) unsigned NO 0 規定每小時允許執行查詢的操作次數 max_updates int(11) unsigned NO 0 規定每小時允許執行更新的操作次數 max_connections int(11) unsigned NO 0 規定每小時允許執行的連接操作次數 max_user_connections int(11) unsigned NO 0 規定允許同時建立的連接次數
1.2 db 表
db 表 比較常用,是 MySQL 數據庫中非常重要的權限表,表中 存儲了用戶對某個數據庫的操作權限 。表中的字段大致可以分為兩類,分別是用戶列和權限列。
用戶列
db 表用戶列有 3 個字段,分別是 Host、User、Db,標識 從某個主機連接某個用戶對某個數據庫的操作權限 ,這 3 個字段的組合構成了 db 表的主鍵。 db 用戶列
字段名 字段類型 是否為空 默認值 說明 Host char(60) NO 無 主機名 Db char(64) NO 無 數據庫名 User char(32) NO 無 用戶名
權限列
db 表中的權限列和 user 表中的權限列大致相同,只是user 表中的權限是針對所有數據庫的,而 db 表中的權限只針對指定的數據庫,如果希望用戶只對某個數據庫有操作權限,可以先將 user 表中對應的權限設置為 N,然后在 db 表中設置對應數據庫的操作權限 。
1.3 tables_priv 表
tables_priv 表 用來 對單個表進行權限設置 。tables_priv 表
字段名 字段類型 是否為空 默認值 說明 Host char(60) NO 無 主機 Db char(64) NO 無 數據庫名 User char(32) NO 無 用戶名 Table_name char(64) NO 無 表名 Grantor char(93) NO 無 修改該記錄的用戶 Timestamp timestamp NO CURRENT_TIMESTAMP 修改該記錄的時間 Table_priv set(‘Select’,‘Insert’,‘Update’,‘Delete’,‘Create’,‘Drop’,‘Grant’,‘References’,‘Index’,‘Alter’,‘Create View’,‘Show view’,‘Trigger’) NO 無 表示對表的操作權限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等 Column_priv set(‘Select’,‘Insert’,‘Update’,‘References’) NO 無 表示對表中的列的操作權限,包括 Select、Insert、Update 和 References
1.4 columns_priv 表
columns_priv 表 用來 對單個數據列進行權限設置 。tables_priv 表
字段名 字段類型 是否為空 默認值 說明 Host char(60) NO 無 主機 Db char(64) NO 無 數據庫名 User char(32) NO 無 用戶名 Table_name char(64) NO 無 表名 Column_name char(64) NO 無 數據列名稱,用來指定對哪些數據列具有操作權限 Timestamp timestamp NO CURRENT_TIMESTAMP 修改該記錄的時間 Column_priv set(‘Select’,‘Insert’,‘Update’,‘References’) NO 無 表示對表中的列的操作權限,包括 Select、Insert、Update 和 References
1.5 procs_priv表
procs_priv 表 可以 對存儲過程和存儲函數進行權限設置 。procs_priv 表
字段名 字段類型 是否為空 默認值 說明 Host char(60) NO 無 主機名 Db char(64) NO 無 數據庫名 User char(32) NO 無 用戶名 Routine_name char(64) NO 無 表示存儲過程或函數的名稱 Routine_type enum(‘FUNCTION’,‘PROCEDURE’) NO 無 表示存儲過程或函數的類型,Routine_type 字段有兩個值,分別是 FUNCTION 和 PROCEDURE。FUNCTION 表示這是一個函數;PROCEDURE 表示這是一個存儲過程。 Grantor char(93) NO 無 插入或修改該記錄的用戶 Proc_priv set(‘Execute’,‘Alter Routine’,‘Grant’) NO 無 表示擁有的權限,包括 Execute、Alter Routine、Grant 3種 Timestamp timestamp NO CURRENT_TIMESTAMP 表示記錄更新時間
【 2. 用戶管理 】
2.1 創建用戶 CREATE USER
問題背景 MySQL 在安裝時,會默認創建一個名為 root 的用戶,該用戶 擁有超級權限,可以控制整個 MySQL 服務器 。 在對 MySQL 的日常管理和操作中,為了避免有人惡意使用 root 用戶控制數據庫,我們通常創建一些具有適當權限的用戶,盡可能地不用或少用 root 用戶登錄系統,以此來確保數據的安全訪問。 使用 CREATE USER 語句來創建 MySQL 用戶,并設置相應的密碼。 基本語法: 用戶 指定創建用戶賬號,格式為 user_name’@'host_name。這里的user_name是用戶名,host_name為主機名,即用戶連接 MySQL 時所用主機的名字。 如果在創建的過程中,只給出了用戶名,而沒指定主機名,那么主機名默認為“%”,表示一組主機,即 不指定主機名則默認對所有主機開放權限。 IDENTIFIED BY ‘password’ 用于指定用戶密碼。新用戶可以沒有初始密碼,若該用戶不設密碼,可省略此子句,但是從安全的角度來說,不推薦這種做法。 ‘password’ 表示用戶登錄時使用的密碼,需要用單引號括起來。 使用 CREATE USER 語句 必須擁有 mysql 數據庫的 INSERT 權限或全局 CREATE USER 權限 。 使用 CREATE USER 語句創建一個用戶后,MySQL 會在 mysql 數據庫的 user 表中添加一條新記錄。 CREATE USER 語句可以同時創建多個用戶,多個用戶用逗號隔開。
CREATE USER < 用戶>
[ IDENTIFIED BY 'password' ]
[ , 用戶 [ IDENTIFIED BY 'password' ] ]
新創建的用戶擁有的權限很少,它們只能執行不需要權限的操作。如登錄 MySQL、使用 SHOW 語句查詢所有存儲引擎和字符集的列表等。 如果兩個用戶的用戶名相同,但主機名不同,MySQL 會將它們視為兩個用戶,并允許為這兩個用戶分配不同的權限集合。 實例 使用 CREATE USER 創建一個用戶,用戶名是 test1,密碼是 test1,主機名是 localhost。 CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
2.2 用戶的登陸、退出
登陸 MySQL
啟動 MySQL 服務后,可以使用以下命令來登錄。 -h:指定連接 MySQL 服務器的地址 。可以用 hostname 或 hostIP 表示, hostname 為主機名,hostIP 為主機 IP 地址。 -p:指定連接 MySQL 服務器的端口號 。 port 為連接的端口號 。MySQL 的默認端口號是 3306,因此如果不指定該參數,默認使用 3306 連接 MySQL 服務器。 u:指定連接 MySQL 服務器的用戶名 , -p:提示輸入密碼,即提示 Enter password。 也可以直接在 mysql 命令的 -p 后加上登錄密碼,登錄密碼與 -p 之間沒有空格 ,此時的命令執行后,后面不會提示輸入密碼。 DatabaseName :指定連接到 MySQL 服務器后,登錄到哪一個數據庫中。如果沒有指定,默認為 mysql 數據庫。-e:指定需要執行的 SQL 語句,登錄 MySQL 服務器后執行這個 SQL 語句,然后退出 MySQL 服務器。
mysql - h hostname| hostlP [ - p port] - u username - p DatabaseName - e "SQL語句"
CMD 中 登陸 root 用戶:mysql -u root -p
實例 通過值 localhost 指定 MySQL 服務器的地址,參數 -u 指定了登錄 MySQL 服務器的用戶賬戶,參數 -p 表示會出現輸入密碼提示信息,最后值“mytest”指定了登錄成功后要使用的數據庫。 mysql -h localhost -u root -p test
實例2 使用 root 用戶登錄到自己計算機的 mysql 數據庫,同時查詢 tb_tudent表的表結構。 mysql -h localhost -u root -p mytest -e"DESC tb_tudent"
退出 MySQL
退出 MySQL 服務器的方式很簡單,只要在命令行輸入 EXIT 或 QUIT 即可。“\q”是 QUIT 的縮寫,也可以用來退出 MySQL 服務器。
QUIT;
\q;
2.3 重命名用戶 RENAME USER
基本語法 <舊用戶 >:系統中已經存在的 MySQL 用戶賬號。 <新用戶 >:新的 MySQL 用戶賬號。 使用 RENAME USER 語句,必須擁有 mysql 數據庫的 UPDATE 權限或全局 CREATE USER 權限 。 若系統中舊賬戶不存在或者新賬戶已存在,該語句執行時會出現錯誤。
RENAME USER < 舊用戶> TO < 新用戶>
實例 使用 RENAME USER 語句將用戶名 test1 修改為 testUser1,主機是 localhost。 RENAME USER 'test1'@'localhost' TO 'testUser1'@'localhost';
在 cmd 命令行工具中,使用 testUser1 用戶登錄數據庫服務器。 mysql -h localhost -u testUser1 -p
2.4 刪除用戶 DROP/DELETE USER
DROP USER 刪除普通用戶
用戶的刪除不會影響他們之前所創建的表、索引或其他數據庫對象,因為 MySQL 并不會記錄是誰創建了這些對象。 基本語法: 用戶 用來指定需要刪除的用戶賬號。DROP USER 語句可用于刪除一個或多個用戶,并撤銷其權限。 使用 DROP USER 語句 必須擁有 mysql 數據庫的 DELETE 權限或全局 CREATE USER 權限 。 在 DROP USER 語句的使用中,若沒有明確地給出賬戶的主機名,則該主機名默認為“%”。
DROP USER < 用戶1 > [ , < 用戶2 > ] …
實例1 使用 DROP USER 語句刪除用戶’testUser1@‘localhost’。 DROP USER 'testUser1'@'localhost';
在 cmd 命令行工具中,使用 test1 用戶登錄數據庫服務器,發現登錄失敗,說明用戶已經刪除。 mysql -h localhost -u test1 -p
DELETE 刪除普通用戶
基本語法 可以使用 DELETE 語句直接刪除 mysql.user 表中相應的用戶信息,但必須擁有 mysql.user 表的 DELETE 權限 Host 和 User 這兩個字段都是 mysql.user 表的主鍵。因此,需要兩個字段的值才能確定一條記錄。
DELETE FROM mysql. user WHERE Host= 'hostname' AND User = 'username' ;
2.5 查看用戶權限
mysql 數據庫下的 user 表中存儲著用戶的基本權限,而新創建的用戶只有登錄 MySQL 服務器的權限,沒有任何其它權限,不能查詢 user 表。 使用 SELECT 語句查詢用戶的權限。 基本語法: 要執行該語句,必須擁有對 user 表的查詢權 限。
SELECT * FROM mysql. user ;
也可以使用 SHOW GRANTS 語句查詢用戶的權限。 基本語法: username 表示用戶名。hostname 表示主機名或主機IP。
SHOW GRANTS FOR 'username' @'hostname' ;
實例1 1.創建 testuser1 用戶。 CREATE USER 'testuser1'@'localhost';
2.查詢權限。 USAGE ON *.*表示該用戶對任何數據庫和任何表都沒有權限 。 SHOW GRANTS FOR 'testuser1'@'localhost';
實例2: 查詢 root 用戶的權限 SHOW GRANTS FOR 'root'@'localhost';
2.6 用戶授權 GRANT
授權 就是為某個用戶賦予某些權限。 例如,可以為新建的用戶賦予查詢所有數據庫和表的權限。 為了安全起見,最好不要授予普通用戶 SUPER 權限、GRANT 權限 。 基本語法 priv_type 參數表示權限類型;columns_list 參數表示權限作用于哪些列上,省略該參數時,表示作用于整個表;database.table 用于指定權限的級別,值有: *:表示當前數據庫中的所有表。 . :表示所有數據庫中的所有表。db_name.*:表示某個數據庫中的所有表,db_name 指定數據庫名。 db_name.tbl_name:表示某個數據庫中的某個表或視圖, - db_name 指定數據庫名,tbl_name 指定表名或視圖名。 db_name.routine_name:表示某個數據庫中的某個存儲過程或函數,routine_name 指定存儲過程名或函數名。 TO 子句:如果權限被授予給一個不存在的用戶,MySQL 會自動執行一條 CREATE USER 語句來創建這個用戶,但同時必須為該用戶設置密碼。 user 參數表示用戶賬戶,由用戶名和主機名構成,格式是“‘username’@‘hostname’”;IDENTIFIED BY 參數用來為用戶設置密碼; password 參數是用戶的新密碼。WITH 關鍵字后面帶有一個或多個 with_option 參數。這個參數有 5 個選項,詳細介紹如下: GRANT OPTION:被授權的用戶可以將這些權限賦予給別的用戶; MAX_QUERIES_PER_HOUR count:設置每個小時可以允許執行 count 次查詢; MAX_UPDATES_PER_HOUR count:設置每個小時可以允許執行 count 次更新; MAX_CONNECTIONS_PER_HOUR count:設置每小時可以建立 count 個連接; MAX_USER_CONNECTIONS count:設置單個用戶可以同時具有的 count 個連接。
GRANT priv_type [ ( column_list) ] ON database . table
TO user
[ , user ] . . .
[ WITH with_option [ with_option] . . . ]
MySQL 中可以授予的權限 描述 舉例 列權限 和表中的一個具體列相關。 例如,可以使用 UPDATE 語句更新表 students 中 name 列的值的權限。 表權限 和一個具體表中的所有數據相關。 例如,可以使用 SELECT 語句查詢表 students 的所有數據的權限。 數據庫權限 和一個具體的數據庫中的所有表相關。 例如,可以在已有的數據庫 mytest 中創建新表的權限。 用戶權限 和 MySQL 中所有的數據庫相關。 例如,可以刪除已有的數據庫或者創建一個新的數據庫的權限。
2.6.1 數據庫的權限類型
權限名稱 對應user表中的字段 說明 SELECT Select_priv 表示授予用戶可以使用 SELECT 語句訪問特定數據庫中所有表和視圖的權限。 INSERT Insert_priv 表示授予用戶可以使用 INSERT 語句向特定數據庫中所有表添加數據行的權限。 DELETE Delete_priv 表示授予用戶可以使用 DELETE 語句刪除特定數據庫中所有表的數據行的權限。 UPDATE Update_priv 表示授予用戶可以使用 UPDATE 語句更新特定數據庫中所有數據表的值的權限。 REFERENCES References_priv 表示授予用戶可以創建指向特定的數據庫中的表外鍵的權限。 CREATE Create_priv 表示授權用戶可以使用 CREATE TABLE 語句在特定數據庫中創建新表的權限。 ALTER Alter_priv 表示授予用戶可以使用 ALTER TABLE 語句修改特定數據庫中所有數據表的權限。 SHOW VIEW Show_view_priv 表示授予用戶可以查看特定數據庫中已有視圖的視圖定義的權限。 CREATE ROUTINE Create_routine_priv 表示授予用戶可以為特定的數據庫創建存儲過程和存儲函數的權限。 ALTER ROUTINE Alter_routine_priv 表示授予用戶可以更新和刪除數據庫中已有的存儲過程和存儲函數的權限。 INDEX Index_priv 表示授予用戶可以在特定數據庫中的所有數據表上定義和刪除索引的權限。 DROP Drop_priv 表示授予用戶可以刪除特定數據庫中所有表和視圖的權限。 CREATE TEMPORARY TABLES Create_tmp_table_priv 表示授予用戶可以在特定數據庫中創建臨時表的權限。 CREATE VIEW Create_view_priv 表示授予用戶可以在特定數據庫中創建新的視圖的權限。 EXECUTE ROUTINE Execute_priv 表示授予用戶可以調用特定數據庫的存儲過程和存儲函數的權限。 LOCK TABLES Lock_tables_priv 表示授予用戶可以鎖定特定數據庫的已有數據表的權限。 ALL 或 ALL PRIVILEGES 或 SUPER Super_priv 表示以上所有權限/超級權限
2.6.2 表的權限類型
權限名稱 對應user表中的字段 說明 SELECT Select_priv 授予用戶可以使用 SELECT 語句進行訪問特定表的權限 INSERT Insert_priv 授予用戶可以使用 INSERT 語句向一個特定表中添加數據行的權限 DELETE Delete_priv 授予用戶可以使用 DELETE 語句從一個特定表中刪除數據行的權限 DROP Drop_priv 授予用戶可以刪除數據表的權限 UPDATE Update_priv 授予用戶可以使用 UPDATE 語句更新特定數據表的權限 ALTER Alter_priv 授予用戶可以使用 ALTER TABLE 語句修改數據表的權限 REFERENCES References_priv 授予用戶可以創建一個外鍵來參照特定數據表的權限 CREATE Create_priv 授予用戶可以使用特定的名字創建一個數據表的權限 INDEX Index_priv 授予用戶可以在表上定義索引的權限 ALL 或 ALL PRIVILEGES 或 SUPER Super_priv 所有的權限名
2.6.3 列的權限類型
授予列權限時,<權限類型>的值只能指定為 SELECT、INSERT 和 UPDATE ,同時權限的后面需要加上列名列表 column-list。
2.6.4 用戶的權限類型
最有效率的權限是用戶權限。授予用戶權限時,<權限類型>除了可以指定為授予數據庫權限時的所有值之外,還可以是下面這些值: CREATE USER:表示授予用戶可以創建和刪除新用戶的權限。 SHOW DATABASES:表示授予用戶可以使用 SHOW DATABASES 語句查看所有已有的數據庫的定義的權限。 實例 用戶 testuser1 對所有的數據有查詢、插入權限,并授予 GRANT 權限。 GRANT SELECT,INSERT ON *.* TO 'testuser1'@'localhost' WITH GRANT OPTION;
查詢用戶 testuser1 的權限。 SHOW GRANTS FOR 'testuser1'@'localhost';
2.6 刪除用戶權限 REVOKE
問題背景 在 MySQL 中,可以使用 REVOKE 語句刪除某個用戶的某些權限 (此用戶不會被刪除),在一定程度上可以保證系統的安全性 。 例如,如果數據庫管理員覺得某個用戶不應該擁有 DELETE 權限,那么就可以刪除 DELETE 權限。 要使用 REVOKE 語句,必須擁有 MySQL 數據庫的全局 CREATE USER 權限或 UPDATE 權限 。
刪除用戶某些特定的權限
基本語法 priv_type 參數表示權限的類型;column_list 參數可選,表示權限作用于哪些列上,沒有該參數時作用于整個表上;user 參數由用戶名和主機名構成,格式為“username’@‘hostname’”。
REVOKE priv_type [ ( column_list) ] . . .
ON database . table
FROM user [ , user ] . . .
實例1 使用 REVOKE 語句取消用戶 testuser1 的插入權限 REVOKE INSERT ON *.* FROM 'testuser1 '@'localhost';
查看 testuser1 的權限 結果顯示, testuser1 用戶沒有了INSERT權限,刪除 testuser1 用戶的 INSERT 權限成功。 SHOW GRANTS FOR 'testuser1 '@'localhost';
刪除特定用戶的所有權限
REVOKE ALL PRIVILEGES , GRANT OPTION FROM user [ , user ] . . .
2.8 修改用戶密碼
修改普通用戶密碼
在 MySQL 中,只有 root 用戶可以通過更新 MySQL 數據庫來更改密碼。使用 root 用戶登錄到 MySQL 服務器后,可以修改普通用戶密碼。 基本語法: username 參數是普通用戶的用戶名,hostname 參數是普通用戶的主機名,newpwd 是要更改的新密碼。
ALTER USER 'username' @'localhost' IDENTIFIED BY 'newpwd' ;
SET PASSWORD FOR 'username' @'localhost' = 'newpwd' ;
實例 創建一個沒有密碼的 testuser 用戶 CREATE USER 'testuser'@'localhost';
root 用戶登錄 MySQL 服務器后,再使用 SET 語句將 testuser 用戶的密碼修改為“newpwd”, ALTER USER 'testuser'@'localhost' IDENTIFIED BY 'newpwd';
退出 MySQL 服務器,使用 testuser 用戶登錄,輸入密碼“newpwd” 由運行結果可以看出,testuser 用戶登錄成功,修改密碼成功。 mysql -utestuser -p
修改root用戶密碼
mysqladmin 命令可在Windows 命令行窗口(cmd)中修改root密碼。 基本語法: usermame 指需要修改密碼的用戶名稱,在這里指定為 root 用戶;hostname 指需要修改密碼的用戶主機名,該參數可以不寫,默認是 localhost;password 為關鍵字,而不是指舊密碼;newpwd 為新設置的密碼,必須用雙引號括起來。如果使用單引號會引發錯誤,可能會造成修改后的密碼不是你想要的。
mysqladmin - u username - h hostname - p password "newpwd"
SET PASSWORD 命令可以用來重新設置其他用戶的登錄密碼或者自己使用的賬戶的密碼。
SET PASSWORD = "NEWPWD" ;
實例1:mysqladmin 命令修改用戶密碼。 使用 mysqladmin 將 root 用戶的密碼修改為“rootpwd” 運行結果中,輸入密碼后會提示在命令行界面上使用密碼可能不安全的警告信息,因為在命令行輸入密碼時,MySQL 服務器就會提示這些安全警告信息。 mysqladmin -u root -p password "rootpwd"
用修改后的“rootpwd”密碼登錄 root 用戶。 mysql -u root -p
實例2:SET PASSWORD命令修改用戶密碼。 使用 root 用戶登錄到 MySQL 服務器后,更改root密碼。 SET PASSWORD = "rootpwd3";