
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者帳戶
- MySQL - 解鎖使用者帳戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - INSERT 查詢
- MySQL - SELECT 查詢
- MySQL - UPDATE 查詢
- MySQL - DELETE 查詢
- MySQL - REPLACE 查詢
- MySQL - INSERT IGNORE
- MySQL - INSERT ON DUPLICATE KEY UPDATE
- MySQL - INSERT INTO SELECT
- MySQL 運算子和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - LIKE 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子 (NOT EQUAL)
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - BETWEEN 運算子
- MySQL - UNION 運算子
- MySQL - UNION vs UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自連線 (SELF JOIN)
- MySQL - DELETE JOIN
- MySQL - UPDATE JOIN
- MySQL - UNION vs JOIN
- MySQL 金鑰
- MySQL - 唯一鍵 (UNIQUE KEY)
- MySQL - 主鍵 (PRIMARY KEY)
- MySQL - 外部索引鍵 (FOREIGN KEY)
- MySQL - 組合鍵 (COMPOSITE KEY)
- MySQL - 候選鍵 (ALTERNATE KEY)
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - BEFORE INSERT 觸發器
- MySQL - AFTER INSERT 觸發器
- MySQL - BEFORE UPDATE 觸發器
- MySQL - AFTER UPDATE 觸發器
- MySQL - BEFORE DELETE 觸發器
- MySQL - AFTER DELETE 觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式 (CTE)
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - SIGNAL
- MySQL - RESIGNAL
- MySQL - 字元集
- MySQL - 校對規則
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - EXPLAIN
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - SHOW PROCESSLIST
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - REVOKE 語句
前面,我們討論了 root 使用者如何在安裝後獲得具有預設許可權的 MySQL 伺服器的訪問許可權。這些許可權足以對資料執行基本操作。但是,在某些特殊情況下,使用者可能需要請求伺服器主機撤銷某些許可權。為此,我們使用 MySQL REVOKE 語句。
MySQL REVOKE 語句
MySQL REVOKE 語句用於從使用者中刪除某些管理許可權或角色。它撤銷先前授予的許可權。
語法
以下是 MySQL REVOKE 語句的語法:
REVOKE privileges ON database_name.table_name FROM 'user'@'host';
示例
假設我們使用 CREATE USER 語句在 MySQL 中建立了一個名為 'test_user'@'localhost' 的使用者,如下所示:
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'testpassword';
生成的輸出如下:
Query OK, 0 rows affected (0.23 sec)
現在,讓我們建立一個名為 'test_database' 的資料庫:
CREATE DATABASE test_database;
生成的輸出如下:
Query OK, 1 row affected (0.56 sec)
接下來,我們將使用已建立的資料庫:
USE test_database;
我們得到如下所示的輸出:
Database changed
現在,讓我們在資料庫中建立一個表:
CREATE TABLE MyTable(data VARCHAR(255));
獲得的輸出如下:
Query OK, 0 rows affected (0.67 sec)
以下查詢將許可權授予到上面建立的表到使用者 'test_user'@'localhost':
GRANT SELECT ON test_database.MyTable TO 'test_user'@'localhost';
執行上述程式碼後,我們將得到以下輸出:
Query OK, 0 rows affected (0.31 sec)
您可以使用 SHOW GRANTS 語句驗證已授予的許可權:
SHOW GRANTS FOR 'test_user'@'localhost';
我們得到的輸出如下所示:
test_user@localhost 的許可權 |
---|
GRANT USAGE ON *.* TO `test_user`@`localhost` |
GRANT SELECT ON `test_database`.`mytable` TO `test_user`@`localhost` |
現在,您可以使用如下所示的REVOKE 語句撤銷上述已授予的許可權:
REVOKE SELECT ON test_database.MyTable FROM 'test_user'@'localhost';
我們得到如下所示的輸出:
Query OK, 0 rows affected (0.25 sec)
驗證
我們可以使用如下所示的 SHOW GRANTS 語句驗證 SELECT 許可權是否已被撤銷:
SHOW GRANTS FOR 'test_user'@'localhost';
我們可以看到輸出不再列出 SELECT 許可權,這表明它已被撤銷:
test_user@localhost 的許可權 |
---|
GRANT USAGE ON *.* TO `test_user`@`localhost` |
撤銷所有許可權
如果使用者對使用者具有多個許可權,則可以使用 MySQL 中的 REVOKE ALL 語句一次撤銷所有這些許可權。
語法
以下是 MySQL 中撤銷所有許可權的語法:
REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host';
示例
假設我們建立了一個使用者,如下所示:
CREATE USER 'sample_user'@'localhost';
生成的輸出如下:
Query OK, 0 rows affected (0.18 sec)
我們還建立了一個過程,如下所示:
DELIMITER // CREATE PROCEDURE sample () BEGIN SELECT 'This is a sample procedure'; END// DELIMITER ;
獲得的輸出如下:
Query OK, 0 rows affected (0.29 sec)
此外,我們在資料庫中建立一個名為 'sample' 的表:
CREATE TABLE sample(data INT);
我們得到如下所示的輸出:
Query OK, 0 rows affected (0.68 sec)
現在,以下查詢將 ALTER ROUTINE、EXECUTE 許可權授予到上面建立的過程給名為 'sample_user'@'localhost' 的使用者。
GRANT ALTER ROUTINE, EXECUTE ON PROCEDURE test_database.sample TO 'sample_user'@'localhost';
上述程式碼的輸出如下所示:
Query OK, 0 rows affected (0.20 sec)
類似地,以下查詢將 SELECT、INSERT 和 UPDATE 許可權授予到表 'sample' 給使用者 'sample_user'@'localhost':
GRANT SELECT, INSERT, UPDATE ON test.sample TO 'sample_user'@'localhost';
產生的結果是:
Query OK, 0 rows affected (0.14 sec)
您可以使用 SHOW GRANTS 語句驗證使用者的所有已授予許可權列表:
SHOW GRANTS FOR 'sample_user'@'localhost';
獲得的結果如下:
sample_user@localhost 的許可權 |
---|
GRANT USAGE ON *.* TO `sample_user`@`localhost` |
GRANT SELECT, INSERT, UPDATE ON `test`.`sample` TO `sample_user`@`localhost` |
GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `test_database`.`sample` TO `sample_user`@`localhost` |
最後,要撤銷授予 'sample_user'@'localhost' 的所有許可權,可以使用以下語句:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'sample_user'@'localhost';
產生的結果是:
Query OK, 0 rows affected (0.30 sec)
驗證
撤銷許可權後,您可以再次檢查使用者的許可權:
SHOW GRANTS FOR 'sample_user'@'localhost';
下面的輸出確認所有許可權已被撤銷:
sample_user@localhost 的許可權 |
---|
GRANT USAGE ON *.* TO `sample_user`@`localhost` |
撤銷代理許可權
您可以透過授予 PROXY 許可權來使一個使用者成為另一個使用者的代理。如果您這樣做,則兩個使用者都具有相同的許可權。
示例
假設我們使用 CREATE 語句在 MySQL 中建立了名為 sample_user、proxy_user 的使用者:
CREATE USER sample_user, proxy_user IDENTIFIED BY 'testpassword';
獲得的輸出如下:
Query OK, 0 rows affected (0.52 sec)
現在,我們正在建立表 'Employee':
CREATE TABLE Employee ( ID INT, Name VARCHAR(15), Phone INT, SAL INT);
我們得到如下所示的輸出:
Query OK, 0 rows affected (6.47 sec)
以下查詢將 SELECT 和 INSERT 許可權授予到上面建立的表給使用者 sample_user:
GRANT SELECT, INSERT ON Emp TO sample_user;
獲得的輸出如下:
Query OK, 0 rows affected (0.28 sec)
現在,我們可以使用如下所示的 GRANT 語句將代理許可權分配給使用者 proxy_user:
GRANT PROXY ON sample_user TO proxy_user;
產生的結果是:
Query OK, 0 rows affected (1.61 sec)
您可以使用如下所示的 REVOKE PROXY 語句撤銷代理許可權:
REVOKE PROXY ON sample_user FROM proxy_user;
我們得到以下結果:
Query OK, 0 rows affected (0.33 sec)
撤銷角色
MySQL 中的角色是一組具有名稱的許可權。您可以使用 CREATE ROLE 語句在 MySQL 中建立一個或多個角色。如果您使用不帶 ON 子句的 GRANT 語句,則可以授予角色而不是許可權。
示例
以下查詢建立一個名為 TestRole_ReadOnly 的角色:
CREATE ROLE 'TestRole_ReadOnly';
以下是上述程式碼的輸出:
Query OK, 0 rows affected (0.13 sec)
現在,讓我們使用 GRANT 語句將只讀許可權授予已建立的角色:
GRANT SELECT ON * . * TO 'TestRole_ReadOnly';
獲得的結果為:
Query OK, 0 rows affected (0.14 sec)
然後,您可以按如下方式將建立的角色授予使用者:
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
上述程式碼的輸出如下:
Query OK, 0 rows affected (0.14 sec)
接下來,您可以將“TestRole_ReadOnly”角色授予“newuser”@“localhost”:
GRANT 'TestRole_ReadOnly' TO 'newuser'@'localhost';
我們得到以下結果:
Query OK, 0 rows affected (0.13 sec)
以下查詢將從使用者那裡撤銷角色:
REVOKE 'TestRole_ReadOnly' FROM 'newuser'@'localhost';
執行上述程式碼後,我們將得到以下輸出:
Query OK, 0 rows affected (1.23 sec)
使用客戶端程式撤銷許可權
我們還可以使用客戶端程式從 MySQL 使用者撤銷許可權。
語法
以下是使用各種程式語言撤銷 MySQL 許可權的語法:
要使用 PHP 程式撤銷授予 MySQL 資料庫中使用者的全部許可權,我們需要執行如下所示的 REVOKE ALL 語句:
$sql = "REVOKE ALL, GRANT OPTION FROM user_name"; $mysqli->query($sql);
以下是使用 JavaScript 程式從所需使用者撤銷特定許可權的語法:
sql= "REVOKE privilege_name(s) ON object FROM user_account_name"; con.query(sql, function (err, result) { if (err) throw err; console.log(result); });
要撤銷授予特定使用者的全部許可權,我們需要使用 JDBC execute() 函式執行 REVOKE ALL PRIVILEGES 語句,如下所示:
String sql = "REVOKE ALL PRIVILEGES, GRANT OPTION FROM USER_NAME"; statement.execute(sql);
以下是使用 Python 程式撤銷所需使用者特定許可權的語法:
sql = f"REVOKE {privileges} ON your_database.* FROM '{username_to_revoke}'@'localhost'"; cursorObj.execute(sql);
示例
以下是各種程式語言中此操作的實現:
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass); if($mysqli->connect_errno ) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "REVOKE ALL, GRANT OPTION FROM Sarika"; if($result = $mysqli->query($sql)){ printf("Revoke privileges executed successfully...!"); } if($mysqli->error){ printf("Failed..!" , $mysqli->error); } $mysqli->close();
輸出
獲得的輸出如下:
Revoke privileges executed successfully...!
var mysql = require('mysql2'); var con = mysql.createConnection({ host: "localhost", user: "root", password: "Nr5a0204@123" }); //Connecting to MySQL con.connect(function (err) { if (err) throw err; console.log("Connected!"); console.log("--------------------------"); sql = "CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'testpassword';" con.query(sql); sql = "CREATE DATABASE test_database;" con.query(sql); sql = "USE test_database;" con.query(sql); sql = "CREATE TABLE MyTable(data VARCHAR(255));" con.query(sql); sql = "GRANT SELECT ON test_database.MyTable TO 'test_user'@'localhost';" con.query(sql); sql = "SHOW GRANTS FOR 'test_user'@'localhost';"; con.query(sql, function(err, result){ if (err) throw err; console.log("**Granted privileges:**"); console.log(result); console.log("--------------------------"); }); sql = "REVOKE SELECT ON test_database.MyTable FROM 'test_user'@'localhost';" con.query(sql); sql = "SHOW GRANTS FOR 'test_user'@'localhost';"; con.query(sql, function(err, result){ if (err) throw err; console.log("**Grants after revoking:**"); console.log(result); }); });
輸出
生成的輸出如下:
Connected! -------------------------- **Granted privileges:** [ { 'Grants for test_user@localhost': 'GRANT USAGE ON *.* TO `test_user`@`localhost`' }, { 'Grants for test_user@localhost': 'GRANT SELECT ON `test_database`.`mytable` TO `test_user`@`localhost`' } ] -------------------------- **Grants after revoking:** [ { 'Grants for test_user@localhost': 'GRANT USAGE ON *.* TO `test_user`@`localhost`' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class RevokePriv { public static void main(String[] args) { String url = "jdbc:mysql://:3306/TUTORIALS"; String user = "root"; String password = "password"; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection(url, user, password); Statement st = con.createStatement(); //System.out.println("Database connected successfully...!"); String sql = "REVOKE ALL PRIVILEGES, GRANT OPTION FROM Vivek"; st.execute(sql); System.out.println("You revoked all the privileges form user 'Vivek'"); }catch(Exception e) { e.printStackTrace(); } } }
輸出
獲得的輸出如下所示:
You revoked all the privileges form user 'Vivek'
import mysql.connector # creating the connection object connection = mysql.connector.connect( host='localhost', user='root', password='password' ) username_to_revoke = 'newUser' # privileges we want to revoke privileges = 'SELECT, INSERT, UPDATE' # Create a cursor object for the connection cursorObj = connection.cursor() cursorObj.execute(f"REVOKE {privileges} ON your_database.* FROM '{username_to_revoke}'@'localhost'") print(f"Privileges revoked from the user '{username_to_revoke}' successfully.") cursorObj.close() connection.close()
輸出
以下是上述程式碼的輸出:
Privileges revoked from the user 'newUser' successfully.