MySQL - 顯示許可權



MySQL 中的使用者必須擁有足夠的許可權才能與伺服器互動。這可以透過為使用者分配身份驗證詳細資訊(如密碼)來實現。此外,如果使用者希望與資料互動並在資料上進行操作,則會分別授予操作或管理許可權。

MySQL SHOW PRIVILEGES

MySQL SHOW PRIVILEGES 語句顯示 MYSQL 伺服器支援的許可權列表。顯示的列表包括所有靜態和當前註冊的動態許可權。

資訊(返回列表)包含三列 -

  • 許可權 - 許可權的名稱
  • 上下文 - 許可權適用的 MySQL 物件的名稱。
  • 註釋 - 描述許可權用途的字串值。

語法

以下是列出 MySQL 伺服器中所有許可權的語法 -

SHOW PRIVILEGES;

示例

以下查詢列出 MySQL 伺服器支援的所有許可權 -

SHOW PRIVILEGES

輸出

執行上述程式碼後,我們將獲得以下輸出 -

許可權 上下文 註釋
Alter Tables 更改表
Alter routine Functions, Procedures 更改或刪除儲存函式/過程
Create Databases, Tables, Indexes 建立新的資料庫和表
Create routine Databases 使用 CREATE FUNCTION/PROCEDURE
Create role Server Admin 建立新角色
Create temporary tables Databases 使用 CREATE TEMPORARY TABLE
Create view Tables 建立新檢視
Create user Server Admin 建立新使用者
Delete Tables 刪除現有行
Drop Databases, Tables 刪除資料庫、表和檢視
Drop role Server Admin 刪除角色
Event Server Admin 建立、更改、刪除和執行事件
Execute Functions, Procedures 執行儲存例程
File 伺服器上的檔案訪問 在伺服器上讀取和寫入檔案
Grant option Databases, Tables, Funcs, Procedures 將您擁有的這些許可權授予其他使用者
Index Tables 建立或刪除索引
Insert Tables 將資料插入表中
Lock tables Databases 使用 LOCK TABLES(與 SELECT 許可權一起使用)
Process Server Admin 檢視當前正在執行的查詢的純文字
Proxy Server Admin 使代理使用者成為可能
References Databases,Tables 對錶進行引用
Reload Server Admin 重新載入或重新整理表、日誌和許可權
Replication client Server Admin 詢問從屬伺服器或主伺服器在哪裡
Replication slave Server Admin 從主伺服器讀取二進位制日誌事件
Select Tables 從表中檢索行
Show databases Server Admin 使用 SHOW DATABASES 檢視所有資料庫
Show view Tables 使用 SHOW CREATE VIEW 檢視檢視
Shutdown Server Admin 關閉伺服器
Super Server Admin 使用 KILL thread、SET GLOBAL、CHANGE MASTER 等。
Trigger Tables 使用觸發器
Create tablespace Server Admin 建立/更改/刪除表空間
Update Tables 更新現有行
用法 Server Admin 無許可權 - 僅允許連線
BINLOG_ENCRYPTION_ADMIN Server Admin
AUDIT_ADMIN Server Admin
ENCRYPTION_KEY_ADMIN Server Admin
INNODB_REDO_LOG_ARCHIVE Server Admin
APPLICATION_PASSWORD_ADMIN Server Admin
SHOW_ROUTINE Server Admin
BACKUP_ADMIN Server Admin
BINLOG_ADMIN Server Admin
CLONE_ADMIN Server Admin
CONNECTION_ADMIN Server Admin
SET_USER_ID Server Admin
SERVICE_CONNECTION_ADMIN Server Admin
GROUP_REPLICATION_ADMIN Server Admin
REPLICATION_APPLIER Server Admin
INNODB_REDO_LOG_ENABLE Server Admin
PERSIST_RO_VARIABLES_ADMIN Server Admin
TABLE_ENCRYPTION_ADMIN Server Admin
ROLE_ADMIN Server Admin
REPLICATION_SLAVE_ADMIN Server Admin
SESSION_VARIABLES_ADMIN Server Admin
RESOURCE_GROUP_ADMIN Server Admin
RESOURCE_GROUP_USER Server Admin
SYSTEM_USER Server Admin
SYSTEM_VARIABLES_ADMIN Server Admin
XA_RECOVER_ADMIN Server Admin

使用客戶端程式列出許可權

現在,讓我們看看如何在程式語言(如 Java、PHP、Python、JavaScript、C++ 等)中使用客戶端程式檢索/列出授予當前 MySQL 使用者的所有許可權。

語法

以下是語法 -

要顯示授予使用者的全部許可權,我們需要將 **SHOW PRIVILEGES** 語句作為引數傳遞給 PHP mysqli 庫的 **query()** 函式,如下所示 -

$sql = "SHOW PRIVILEGES";
$mysqli->query($sql);

以下是透過 JavaScript 程式顯示授予當前使用者的所有許可權的語法 -

sql= "SHOW PRIVILEGES;"
con.query(sql, function (err, result) {
   if (err) throw err;
      console.log(result);
});

要顯示當前使用者的許可權,我們需要使用 JDBC 的 executeQuery() 函式執行 SHOW PRIVILEGES 語句,如下所示:

String sql = "SHOW PRIVILEGES";
statement.executeQuery(sql);

以下是透過 Python 程式顯示授予當前 MySQL 使用者的所有許可權的語法:

sql = f"SHOW GRANTS FOR '{username_to_show}'@'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 = "SHOW PRIVILEGES"; if($result = $mysqli->query($sql)){ printf("PRIVILEGES found successfully...!"); printf("Lists are: "); while($row = mysqli_fetch_array($result)){ print_r($row); } } if($mysqli->error){ printf("Failed..!" , $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下:

PRIVILEGES found successfully...!Lists are: Array
(
    [0] => Alter
    [Privilege] => Alter
    [1] => Tables
    [Context] => Tables
    [2] => To alter the table
    [Comment] => To alter the table
)
Array
(
    [0] => Alter routine
    [Privilege] => Alter routine
    [1] => Functions,Procedures
    [Context] => Functions,Procedures
    [2] => To alter or drop stored functions/procedures
    [Comment] => To alter or drop stored functions/procedures
)
Array
(
    [0] => Create
    [Privilege] => Create
    [1] => Databases,Tables,Indexes
    [Context] => Databases,Tables,Indexes
    [2] => To create new databases and tables
    [Comment] => To create new databases and tables
)
Array
(
    [0] => Create routine
    [Privilege] => Create routine
    [1] => Databases
    [Context] => Databases
    [2] => To use CREATE FUNCTION/PROCEDURE
    [Comment] => To use CREATE FUNCTION/PROCEDURE
)
Array
(
    [0] => Create role
    [Privilege] => Create role
    [1] => Server Admin
    [Context] => Server Admin
    [2] => To create new roles
    [Comment] => To create new roles
)
..........

 (
    [0] => REPLICATION_SLAVE_ADMIN
    [Privilege] => REPLICATION_SLAVE_ADMIN
    [1] => Server Admin
    [Context] => Server Admin
    [2] =>
    [Comment] =>
)
Array
(
    [0] => SENSITIVE_VARIABLES_OBSERVER
    [Privilege] => SENSITIVE_VARIABLES_OBSERVER
    [1] => Server Admin
    [Context] => Server Admin
    [2] =>
    [Comment] =>
)
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 = "SHOW PRIVILEGES";
  con.query(sql, function(err, result){
    if (err) throw err;
    console.log(result);
  });
});

輸出

產生的輸出如下:

Connected!
--------------------------
[
  {
    Privilege: 'Alter',
    Context: 'Tables',
    Comment: 'To alter the table'
  },
.
.
.
  {
    Privilege: 'TELEMETRY_LOG_ADMIN',
    Context: 'Server Admin',
    Comment: ''
  }
]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class ShowPriv {
	public static void main(String[] args) {
		String url = "jdbc:mysql://:3306/TUTORIALS";
		String user = "root";
		String password = "password";
		ResultSet rs;
		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 = "SHOW PRIVILEGES";
            rs = st.executeQuery(sql);
            System.out.println("All privileges: "); 
            while(rs.next()) {
            	String priv = rs.getNString(1);
            	System.out.println(priv);
            }
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

輸出

獲得的輸出如下所示:

All privileges: 
Alter
Alter routine
Create
Create routine
Create role
Create temporary tables
Create view
Create user
Delete
Drop
Drop role
Event
Execute
File
Grant option
Index
Insert
Lock tables
Process
Proxy
References
Reload
Replication client
Replication slave
Select
Show databases
Show view
Shutdown
Super
import mysql.connector
# creating the connection object
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password'
)
username_to_show = 'newUser'
# Create a cursor object for the connection
cursorObj = connection.cursor()
cursorObj.execute(f"SHOW GRANTS FOR '{username_to_show}'@'localhost'")
privileges = cursorObj.fetchall()
print(f"Privileges for user '{username_to_show}' are:")
for grant in privileges:
    print(grant[0])
cursorObj.close()
connection.close()

輸出

以下是上述程式碼的輸出:

Privileges for user 'newUser' are:
GRANT USAGE ON *.* TO `newUser`@`localhost`
GRANT SELECT, INSERT, UPDATE ON `your_database`.* TO `newUser`@`localhost`
廣告