文章目錄
- 前言
- 一、用戶
- 用戶信息
- 創建用戶
- 修改密碼
- 刪除用戶
- 二、數據庫的權限
- MySQL中的權限
- 給用戶授權
- 回收權限
- 總結
前言
??其實與 Linux 操作系統類似,MySQL 中也有 超級用戶 和 普通用戶 之分
??如果一個用戶只需要訪問 MySQL 中的某一個數據庫,甚至數據庫中的某一個表,那么可以為其創建一個普通用戶,并為該用戶賦予對應的權限,而不讓該用戶看到數據庫中的其他數據,防止該用戶對其他數據進行誤操作,由此就有了我們該篇的講解,即 用戶管理!
一、用戶
用戶信息
??MySQL 當中默認有一個名為 mysql 的數據庫
??查看該數據庫中的表,可以看到其中有一個名為 user 的表
??user 表中存儲的就是 MySQL 中用戶相關的信息
部分的字段說明:
- user: 表示該用戶的用戶名。
- host: 表示該用戶可以從哪個主機登錄,localhost表示只能從本機登錄,%表示可以從任意地方登錄。
- authentication_string: 表示該用戶的密碼經過password函數加密后的值。
- xxx_priv: 表示該用戶是否擁有對應權限。
??我們還可以只選擇部分字段進行展示:
??同時我們注意到因為 user 表中的主鍵是復合主鍵,由表中的 user 列和 host 列共同承擔,所以 MySQL 中可以存在同名的用戶,只要這些同名用戶對應的登錄主機不同即可
創建用戶
??創建用戶的 SQL 如下:
CREATE USER '用戶名'@'登錄主機' IDENTIFIED BY '密碼';
??比如下面創建一個用戶名為 HQ ,并且可以從任意地方登錄的用戶
??創建用戶成功后,該用戶的相關信息也就被寫入到剛才的 user 表中了
??這時便可以用新創建的普通用戶來連接 MySQL 服務器了
??此外,由于我們創建的這個用戶可以從任意地方登錄,因此如果你在 Windows 下也安裝了 MySQL ,那么就可以在 Windows 的 cmd 窗口進行遠程登錄
- 創建用戶的SQL當中包含用戶的密碼,因此該SQL不會被歷史記錄下來,所以不能通過上下鍵進行追溯。
- MySQL本身的認證級別比較高,因此創建用戶時設置的密碼不能太簡單,否則會出現報錯,這時你可以選擇將密碼設置復雜一些,也可以對密碼相關的設置進行調整。
??通過show命令查看全局變量,可以看到密碼設置相關的要求
修改密碼
??你可能會看到有些博主說 set password = password(‘你的密碼’); 事實上在 MySQL 5.7.6 及更高版本中,PASSWORD() 函數已被棄用,且修改密碼的語法發生了變化,所以這種方法失效了,有用的如下:
??用戶自己和超級用戶修改自己的密碼
ALTER USER '用戶名'@'主機名' IDENTIFIED BY '你的密碼';
FLUSH PRIVILEGES; #刷新權限一下
刪除用戶
??刪除用戶的SQL語句如下:
DROP USER '用戶名'@'登錄地址';
??刪除用戶時如果不指明待用戶的登錄地址,則默認刪除的是登錄地址為 % 的用戶。
二、數據庫的權限
MySQL中的權限
權限 | 列名 | 上下文 |
---|---|---|
CREATE | Create_priv | 數據庫、表或索引 |
DROP | Drop_priv | 數據庫或表 |
GRANT OPTION | Grant_priv | 數據庫、表或保存的程序 |
REFERENCES | References_priv | 數據庫或表 |
ALTER | Alter_priv | 表 |
DELETE | Delete_priv | 表 |
INDEX | Index_priv | 表 |
SELECT | Select_priv | 表 |
UPDATE | Update_priv | 表 |
CREATE VIEW | Create_view_priv | 視圖 |
SHOW VIEW | Show_view_priv | 視圖 |
ALTER ROUTINE | Alter_routine_priv | 保存的程序 |
CREATE ROUTINE | Create_routine_priv | 保存的程序 |
EXECUTE | Execute_priv | 保存的程序 |
FILE | File_priv | 服務器主機上的文件訪問 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 服務器管理 |
LOCK TABLES | Lock_tables_priv | 服務器管理 |
CREATE USER | Create_user_priv | 服務器管理 |
PROCESS | Process_priv | 服務器管理 |
RELOAD | Reload_priv | 服務器管理 |
REPLICATION CLIENT | Repl_client_priv | 服務器管理 |
REPLICATION SLAVE | Repl_slave_priv | 服務器管理 |
SHOW DATABASES | Show_db_priv | 服務器管理 |
SHUTDOWN | Shutdown_priv | 服務器管理 |
SUPER | Super_priv | 服務器管理 |
??新創建的用戶沒有任何權限,因此創建用戶后需要給用戶授權
給用戶授權
??給用戶授權的SQL如下:
-- 對于 MySQL8.0及以上版本,GRANT 語句 不能直接結合 IDENTIFIED BY 子句 來創建用戶或修改密碼。這兩個操作需要分開執行。(問就是嘗試過,繃)
-- 1. 創建用戶(或修改密碼)
CREATE USER IF NOT EXISTS 'HQ'@'%' IDENTIFIED BY '@Lhq123456';
-- 如果用戶已存在,改用:
-- ALTER USER 'HQ'@'%' IDENTIFIED BY '@Lhq123456';-- 2. 授予權限
GRANT SELECT ON Test.* TO 'HQ'@'%';
FLUSH PRIVILEGES;
- ‘用戶名’@‘登錄地址’:表示給哪一個用戶授權。
- 庫名.對象名:表示要授予用戶哪個數據庫下的哪個對象的權限。
- 權限列表:表示要授予用戶何種權限,多個權限之間用逗號隔開。
- IDENTIFIED BY ‘密碼’:創建用戶的同時也要設置一個密碼
??比如下面創建用戶 HQ ,并授予用戶在 Test 數據庫下所有對象的 select 權限
??授權后通過 show grants for ‘用戶名’@‘登錄地址’ 命令,可以查看該用戶現有的權限
- 創建用戶后該用戶默認會有 USAGE 權限,該權限只能用于數據庫登錄,不能執行任何操作。
- *.*表示所有數據庫的所有對象,庫名.*表示某個數據庫的所有對象(表、視圖、存儲過程等)
??進入 Test 數據庫后,也能查看其中的所有表
??但該用戶目前只能查看表中的信息,而不能對表中的數據進行修改,因為我們只授予了該用戶 select 權限。如下
??下面將 Test 數據庫下的所有權限都授予該用戶
??這時該用戶才可以對表中的數據進行其他操作
回收權限
??回收權限的SQL如下:
REVOKE 權限列表 ON 庫名.對象名 FROM '用戶名'@'登錄地址';
- 回收權限的語法與授權一樣,只不過將 to 關鍵字改為了 from
比如下面將用戶 HQ 在 Test 數據庫下的所有權限回收
??但是回收用戶在某一數據庫下的權限后,在該用戶下一次進入該數據庫時才會起作用,如果回收權限時該用戶正在使用對應數據庫,那么回收權限后該用戶仍然擁有對應的權限。
總結
??怎么樣,這篇也不難吧,但是更令人振奮的是馬上就要迎來 MySQL 的尾聲了,至少我接下來很大一段時間不會再更新 MySQL 專欄了