MySQL การใช้งานฟังก์ชัน SYSTEM_USER()

ฟังก์ชัน SYSTEM_USER() ใน MySQL ใช้เพื่อคืนค่าชื่อผู้ใช้และโฮสต์ที่เชื่อมต่อกับฐานข้อมูล (user@host) เช่นเดียวกับ USER() และ SESSION_USER()

ฟังก์ชันนี้จะแสดงผู้ใช้ที่เข้าสู่ระบบจริง ๆ (login user) ไม่ใช่ผู้ที่มีสิทธิ์รันคำสั่งแบบ DEFINER เหมือน CURRENT_USER() โดยค่าที่ได้จะคงที่ตลอดช่วงเวลาการเชื่อมต่อ (session)

ประโยชน์ของฟังก์ชัน SYSTEM_USER()

  • ใช้ตรวจสอบว่า session ปัจจุบันเชื่อมต่อเข้าระบบด้วย user อะไร
  • เหมาะกับการสร้างระบบ audit log หรือ security log
  • ใช้ตรวจสอบความแตกต่างระหว่าง user ที่ login กับ user ที่ใช้สิทธิ์จริง (กรณีมีการเปลี่ยนสิทธิ์)
  • ใช้ร่วมกับคำสั่ง INSERT, SELECT, WHERE, หรือใน trigger ได้
  • แสดง user จริงในระดับ connection session ได้อย่างถูกต้อง

รูปแบบการใช้งาน

SYSTEM_USER()
  • ผลลัพธ์จะอยู่ในรูปแบบ 'user_name'@'host' เช่น 'admin'@'localhost'

ตัวอย่างการใช้งาน

SQL
SELECT SYSTEM_USER() AS login_user;
-- ผลลัพธ์: 'root'@'localhost'

สมมติว่ามีตารางชื่อ login_log ซึ่งเก็บข้อมูลดังนี้

log_id login_user login_time
1admin@localhost2024-04-10 09:00:00
2[email protected]2024-04-10 10:05:00

บันทึกผู้ใช้ที่เชื่อมต่อระบบเข้ามา

SQL
INSERT INTO login_log (login_user, login_time)
VALUES (SYSTEM_USER(), NOW());

หมายเหตุ

  • SYSTEM_USER() เป็น alias ของ USER() และ SESSION_USER() ให้ค่าผลลัพธ์เหมือนกันทุกประการ
  • อย่าสับสนกับ CURRENT_USER() ซึ่งคืนค่าผู้ที่มีสิทธิ์รันคำสั่งในปัจจุบัน (อาจต่างจากผู้ login)
  • ไม่แนะนำให้ใช้ SYSTEM_USER() ในการควบคุมสิทธิ์แบบละเอียด (ควรใช้ CURRENT_USER() ร่วมด้วย)
  • ค่า user@host ที่ได้อาจเปลี่ยนไปตามโฮสต์ต้นทางที่เชื่อมต่อ เช่นจาก localhost หรือ IP จริง
แชร์เรื่องนี้