Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

แก้ไขปัญหา DEFINER=root@% ไม่ทำงานใน Localhost MySQL

การแก้ไขปัญหา Stored Procedure DEFINER ไม่ตรงกับ Host ใน MySQL

ปัญหาเกิดจาก DEFINER ระบุ Host เป็น % (ทุก Host) แต่ผู้ใช้จริงเชื่อมต่อจาก localhost ทำให้ MySQL ไม่จับคู่ได้

ขั้นตอนการแก้ไข

1. ตรวจสอบผู้ใช้และ Host ที่มีอยู่

mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| Bob              | %         |
| David            | localhost |
| ...              | ...       |
+------------------+-----------+

2. สร้าง Stored Procedure ด้วย DEFINER ที่ตรงกับ User/Host ที่มีอยู่

ตัวอย่างสร้าง Procedure ด้วย DEFINER = Bob@% (ซึ่งมีอยู่ในระบบ):

mysql> DELIMITER //
mysql> CREATE DEFINER=`Bob`@`%` PROCEDURE `Message`()
    BEGIN
        SELECT "Hello World";
    END //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;

3. เรียกใช้ Procedure

mysql> CALL `Message`();
+-------------+
| Hello World |
+-------------+
| Hello World |
+-------------+

แนวทางแก้ไขทั่วไป:

  • สร้าง User ให้ตรงกับ Host ที่ใช้จริง (localhost หรือ %)
  • หรือแก้ไข DEFINER ของ Procedure ที่มีอยู่: ALTER PROCEDURE `proc_name` DEFINER = `user`@`host` ...
  • หรือสร้าง Procedure โดยไม่ระบุ DEFINER (จะใช้ CURRENT_USER อัตโนมัติ)
  • ตรวจสอบ SQL SECURITY ของ Procedure: DEFINER (เริ่มต้น) หรือ INVOKER

คำเตือน: การใช้ root@% มีความเสี่ยงด้านความปลอดภัย ควรสร้าง User เฉพาะเจาะจงและจำกัดสิทธิ์แทน