入門MySQL——用戶與許可權

来源:https://www.cnblogs.com/kunjian/archive/2019/08/24/11405838.html
-Advertisement-
Play Games

前言: 前面幾篇文章為大家介紹了各種SQL語法的使用,本篇文章將主要介紹MySQL用戶及許可權相關知識,如果你不是DBA的話可能平時用的不多,但是瞭解下也是好處多多。 1.創建用戶 官方推薦創建語法為: 通常我們常用的創建語法為: 語法說明如下: 1) 指定創建用戶賬號,格式為 'user_name' ...


前言: 

前面幾篇文章為大家介紹了各種SQL語法的使用,本篇文章將主要介紹MySQL用戶及許可權相關知識,如果你不是DBA的話可能平時用的不多,但是瞭解下也是好處多多。

1.創建用戶

官方推薦創建語法為:

CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD 'auth_string'
}

tls_option: {
   SSL
 | X509
 | CIPHER 'cipher'
 | ISSUER 'issuer'
 | SUBJECT 'subject'
}

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

password_option: {
    PASSWORD EXPIRE
  | PASSWORD EXPIRE DEFAULT
  | PASSWORD EXPIRE NEVER
  | PASSWORD EXPIRE INTERVAL N DAY
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

通常我們常用的創建語法為:

CREATE USER <用戶名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>

語法說明如下:
1) <用戶名>
指定創建用戶賬號,格式為 'user_name'@'host_name'。這裡user_name是用戶名,host_name為主機名,即用戶連接 MySQL 時所在主機的名字。若在創建的過程中,只給出了賬戶的用戶名,而沒指定主機名,則主機名預設為“%”,表示一組主機。
2) PASSWORD
可選項,用於指定散列口令,即若使用明文設置口令,則需忽略PASSWORD關鍵字;若不想以明文設置口令,且知道 PASSWORD() 函數返回給密碼的散列值,則可以在口令設置語句中指定此散列值,但需要加上關鍵字PASSWORD
3) IDENTIFIED BY子句
用於指定用戶賬號對應的口令,若該用戶賬號無口令,則可省略此子句。
4) <口令>
指定用戶賬號的口令,在IDENTIFIED BY關鍵字或PASSWOED關鍵字之後。給定的口令值可以是只由字母和數字組成的明文,也可以是通過 PASSWORD() 函數得到的散列值。

使用 CREATE USER 語句應該註意以下幾點:

  • 如果使用 CREATE USER 語句時沒有為用戶指定口令,那麼 MySQL 允許該用戶可以不使用口令登錄系統,然而從安全的角度而言,不推薦這種做法。
  • 使用 CREATE USER 語句必須擁有 MySQL 中 mysql 資料庫的 INSERT 許可權或全局 CREATE USER 許可權。
  • 使用 CREATE USER 語句創建一個用戶賬號後,會在系統自身的 MySQL 資料庫的 user 表中添加一條新記錄。若創建的賬戶已經存在,則語句執行時會出現錯誤。
  • 新創建的用戶擁有的許可權很少。他們可以登錄 MySQL,只允許進行不需要許可權的操作,如使用 SHOW 語句查詢所有存儲引擎和字元集的列表等。
  • 如果兩個用戶具有相同的用戶名和不同的主機名,MySQL 會將他們視為不同的用戶,並允許為這兩個用戶分配不同的許可權集合。

示例:

#註意:test_user@'%' 和 test_user@'localhost' 是兩個不同的用戶
CREATE USER 'test_user'@'%' identified by '123456';
CREATE USER 'test_user'@'localhost' identified by '123456789';

2.更改用戶

更改用戶信息主要包括重命名,改密碼,鎖定或解鎖用戶。下麵將通過案例為大家展示這些用法:

#重命名用戶
RENAME USER 'test_user'@'%' to 'test'@'%';

#修改密碼
ALTER USER 'test'@'%' identified by '123456789';

#鎖定或解鎖用戶
ALTER USER 'test'@'%' ACCOUNT LOCK;
ALTER USER 'test'@'%' ACCOUNT UNLOCK;

3.刪除用戶

MySQL 資料庫中可以使用 DROP USER 語句來刪除一個或多個用戶賬號以及相關的許可權。
官方推薦語法格式:

DROP USER [IF EXISTS] user [, user] ...

使用 DROP USER 語句應該註意以下幾點:

  • DROP USER 語句可用於刪除一個或多個 MySQL 賬戶,並撤銷其原有許可權。
  • 使用 DROP USER 語句必須擁有 MySQL 中的 mysql 資料庫的 DELETE 許可權或全局 CREATE USER 許可權。
  • 在 DROP USER 語句的使用中,若沒有明確地給出賬戶的主機名,則該主機名預設為“%”。

4.用戶授權

當成功創建用戶後,還不能執行任何操作,需要為該用戶分配適當的訪問許可權。可以使用 SHOW GRANT FOR 語句來查詢用戶的許可權。

註意:新創建的用戶只有登錄 MySQL 伺服器的許可權,沒有任何其他許可權,不能進行其他操作。
USAGE ON . 表示該用戶對任何資料庫和任何表都沒有許可權。

對於新建的 MySQL 用戶,必須給它授權,可以用 GRANT 語句來實現對新建用戶的授權。官方推薦語法格式:

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [auth_option] [, user [auth_option]] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH {GRANT OPTION | resource_option} ...]

GRANT PROXY ON user
    TO user [, user] ...
    [WITH GRANT OPTION]

object_type: {
    TABLE
  | FUNCTION
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
  | IDENTIFIED BY PASSWORD 'auth_string'
}

tls_option: {
    SSL
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'
}

resource_option: {
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

首先大家要知道,許可權是分級別的。可以授予的許可權有如下幾組:

  • 列級別,和表中的一個具體列相關。例如,可以使用 UPDATE 語句更新表 students 中 student_name 列的值的許可權。
  • 表級別,和一個具體表中的所有數據相關。例如,可以使用 SELECT 語句查詢表 students 的所有數據的許可權。
  • 資料庫級別,和一個具體的資料庫中的所有表相關。例如,可以在已有的資料庫 mytest 中創建新表的許可權。
  • 全局,和 MySQL 中所有的資料庫相關。例如,可以刪除已有的資料庫或者創建一個新的資料庫的許可權。

下表是所有可授予的許可權及其意義:

許可權 意義和可授予級別
ALL [PRIVILEGES] 授予在指定的訪問級別的所有許可權,除了 GRANT OPTION和 PROXY
ALTER 啟用ALTER TABLE。級別:全局,資料庫,表。
ALTER ROUTINE 允許更改或刪除存儲過程。級別:全局,資料庫。
CREATE 啟用資料庫和表創建。級別:全局,資料庫,表。
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 啟用要刪除資料庫,表和視圖。級別:全局,資料庫,表。
EVENT 啟用事件使用。級別:全局,資料庫。
EXECUTE 使用戶能夠執行存儲過程。級別:全局,資料庫。
FILE 使用戶能夠使伺服器讀取或寫入文件。等級:全局。
GRANT OPTION 啟用授予其他帳戶或從其他帳戶中刪除的許可權。級別:全局,資料庫,表,代理。
INDEX 啟用要創建或刪除索引。級別:全局,資料庫,表。
INSERT 啟用INSERT。級別:全局,資料庫,表,列。
LOCK TABLES 允許使用LOCK TABLES您擁有該SELECT 許可權的表。級別:全局,資料庫。
PROCESS 使用戶能夠查看所有進程SHOW PROCESSLIST。等級:全局。
PROXY 啟用用戶代理。級別:從用戶到用戶。
REFERENCES 啟用外鍵創建。級別:全局,資料庫,表,列。
RELOAD 啟用FLUSH操作。等級:全局。
REPLICATION CLIENT 使用戶可以詢問主伺服器或從伺服器的位置。等級:全局。
REPLICATION SLAVE 啟用複製從屬以從主伺服器讀取二進位日誌。等級:全局。
SELECT 啟用SELECT。級別:全局,資料庫,表,列。
SHOW DATABASES 啟用SHOW DATABASES以顯示所有資料庫。等級:全局。
SHOW VIEW 啟用SHOW CREATE VIEW。級別:全局,資料庫,表。
SHUTDOWN 啟用mysqladmin shutdown。等級:全局。
SUPER 能夠使用如其他命令 CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL,和中mysqladmin的調試命令。等級:全局。
TRIGGER 啟用觸發操作。級別:全局,資料庫,表。
UPDATE 啟用UPDATE。級別:全局,資料庫,表,列。
USAGE “ no privileges ”的同義詞

其實grant語句可以直接創建用戶並授權,這裡建議大家先用create user語句創建好用戶之後再單獨進行授權。下麵我將用示例為大家展示如何授權:

#全局許可權
GRANT super,select on *.* to 'test_user'@'%';

#庫許可權
GRANT select,insert,update,delete,create,alter,execute on `testdb`.* to 'test_user'@'%';

#表許可權
GRANT select,insert on `testdb`.tb to 'test_user'@'%';

#列許可權
GRANT select (col1), insert (col1, col2) ON `testdb`.mytbl to 'test_user'@'%';

5.回收許可權

在MySQL中,可以使用 REVOKE 語句回收一個用戶的許可權,此用戶不會被刪除。

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL [PRIVILEGES], GRANT OPTION
    FROM user [, user] ...

語法說明如下:

  • REVOKE 語法和 GRANT 語句的語法格式相似,但具有相反的效果。
  • 第一種語法格式用於回收某些特定的許可權。
  • 第二種語法格式用於回收特定用戶的所有許可權。
  • 要使用 REVOKE 語句,必須擁有 MySQL 資料庫的全局 CREATE USER 許可權或 UPDATE 許可權。

一般情況下我們先會使用show grants語法查詢該用戶的許可權,如果發現許可權過大,會用revoke語法回收許可權。示例如下:

#查看用戶許可權
mysql> show grants for 'test_user'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for test_user@%                                                                              |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user'@'%'                                                               |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, EXECUTE ON `testdb`.* TO 'test_user'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

#發現許可權過大,想回收drop,alter許可權 則可以這樣回收:
REVOKE drop,alter on `testdb`.* from 'test_user'@'%';

總結: 

本篇文章為大家介紹瞭如何創建,更改,刪除用戶以及如何授於和回收許可權。希望大家能對MySQL中用戶管理這一塊能有更深的認識。入門MySQL系列文章寫了好幾篇了,一開始並沒有想好寫多少篇的準備,可能邏輯也不太合理,還是感謝大家的閱讀。最後一篇打算寫備份與恢復相關內容,大家期待一下哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.分散式文件系統: 是指文件系統管理的物理存儲資源不一定直接是連接在本地節點上,而是通過電腦網路與節點相連. 分散式文件系統的設計基與C/S架構(客戶端/伺服器) 常見的分散式文件系統:Ceph、(紅帽)Hadoop、FastDFS(國產) 二.Ceph分散式文件系統 特點:具有高擴展、高可用、 ...
  • 目錄 Cacti+nagios監控部署步驟... 2 一、Cacti安裝... 2 1需要安裝的依賴軟體包:... 2 2安裝rrdtool 2 3啟動資料庫和httpd服務... 3 4將servername和ip對應寫入hosts 3 5安裝cacti 3 6創建cacti資料庫並授權:... ...
  • 隊列的分類 隊列一般分為三種:順序隊列、迴圈隊列、鏈式隊列 其中順序隊列和迴圈隊列按照存儲方式又可以分為動態和靜態,鏈式隊列是動態的。 順序隊列 順序隊列存在”假溢出“現象:即隊頭由於出隊操作,還有剩餘空間,但隊尾指針已達到數組的末尾,如果繼續插入元素,隊尾指針就會越出數組的上界,而造成“溢出”,這 ...
  • 一、在struct termios結構體中,對串口進行基本配置(如波特率設置,校驗位和停止位設置 等)。 (一): struct termios //串口的設置主要是設置struct termios結構體的各成員 { tcflag_t c_iflag; //input mode flags 輸入模式 ...
  • 許可權的基本介紹: rwx許可權詳解: rwx作用到文件: [r]:代表可讀,可以讀取、查看 [w]:代表可寫,可以修改,但不代表可以刪除該文件,刪除一個文件的前提條件是對該文件所在的目錄有寫許可權才能刪除該文件 [x]:代表可執行 rwx作用在目錄: [r]:代表可讀,可以讀取、ls查看目錄內容 [w] ...
  • 平常我經常使用 htop 工具來進行對主機進行性能檢測。但是它只能對 進行進行管理。並簡要顯示 進程和cpu和記憶體使用信息; glances 是比較好的性能檢測工具。相比較htop還能顯示 disk io net 等更多信息。並且還有web ui和ipc 模式。當我們有多台機器的時候,使用此工具極為 ...
  • 使用 Linux 好久了,一定會意識到一個問題,某個分區容量不夠用了,想要擴容怎麼辦?這裡就涉及到 LVM 邏輯捲的管理了,可以動態調整 Linux 分區容量。 ...
  • [20190823]關於CPU成本計算2.txt--//前幾天探究CPU cost時遇到的問題,獲取行成本時我的測試查詢結果出現跳躍,不知道為什麼,感覺有點奇怪,分析看看。--//ITPUB原始鏈接已經不存在,我的日記本還有記錄,現在想想當時的記錄思路很亂,不過這些都是猜測的過程,以前思路混亂也是正 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...