首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 用戶資訊函數辨析:USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()

     編輯:MySQL 資料庫相關知識

MySQL 用戶資訊函數辨析:USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()


MySQL 提供四個函數回傳當前連線的用戶資訊,前三者為同義詞,**CURRENT_USER() 在特定情境下行為不同**,理解差異對權限審計、存儲程序安全定義者模式至關重要。


函數定義與回傳值對比

函數官方描述摘要回傳值範例同義詞關係
USER()回傳客戶端連線時提供的用戶名@主機名(utf8 字串)root@localhost
app_user@192.168.1.50
**三者完全同義**
可互換使用
SYSTEM_USER()USER() 的同義詞同上
SESSION_USER()USER() 的同義詞同上
CURRENT_USER()回傳**伺服器實際用來認證**的帳號@主機(可能與 USER() 不同),決定權限基準。存儲程序若定義 SQL SECURITY DEFINER,則回傳**定義者**而非呼叫者。root@%
definer_user@%
獨立函數

關鍵差異場景

1. 通配符主機匹配

  • 建立帳號:CREATE USER 'app'@'%' IDENTIFIED BY 'pwd';
  • 客戶端連線:mysql -u app -h 192.168.1.10
  • USER() → app@192.168.1.10(實際連線 IP)
  • CURRENT_USER() → app@%(匹配的權限記錄)

2. 存儲程序 SECURITY DEFINER(MySQL 5.0.10+)

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`()
SQL SECURITY DEFINER
BEGIN
    SELECT USER(), CURRENT_USER();
END;
  • 以 app@192.168.1.10 呼叫 CALL sp_test()
  • USER() → app@192.168.1.10(呼叫者)
  • CURRENT_USER() → root@localhost(定義者)

**用途**:在 DEFINER 程序內執行敏感操作(如寫入審計表)時,用 CURRENT_USER() 記錄實際權限擁有者。

3. Proxy 用戶

  • CREATE USER 'proxy_user'@'%' IDENTIFIED WITH mysql_native_password AS '...' REQUIRE SUBJECT '...';
  • 外部認證(LDAP、PAM)映射為資料庫用戶時,USER() 為外部身分,CURRENT_USER() 為映射後的資料庫帳號。

實務應用指南

需求推薦函數理由
審計日誌記錄「誰連線進來」USER()反映真實客戶端身分與來源 IP
判斷當前執行權限基準CURRENT_USER()對應 mysql.user 權限記錄,含 DEFINER 切換
存儲程序內動態 SQL 權限檢查CURRENT_USER()DEFINER 模式下反映定義者權限
應用層顯示「當前登入用戶」USER()使用者可辨識的帳號@主機

快速驗證腳本

SELECT 
    USER() AS user_func,
    SYSTEM_USER() AS system_user_func,
    SESSION_USER() AS session_user_func,
    CURRENT_USER() AS current_user_func;

在不同連線方式(本地、遠端、Proxy、存儲程序)執行上述查詢,觀察四欄位差異,即可建立直觀認知。


總結

  • USER()/SYSTEM_USER()/SESSION_USER() = **客戶端聲稱身分**(連線時提供)。
  • CURRENT_USER() = **伺服器認可身分**(權限計算基準、DEFINER 切換)。
  • 兩者**可能不同**,差異來源:主機通配符匹配、DEFINER 存儲程序、Proxy 認證。
  • 權限相關邏輯**務必用 CURRENT_USER()**;顯示/審計用戶身分**用 USER()**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved