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

MySQL: สร้างผู้ใช้ (CREATE USER) ด้วยตัวแปรและ Prepared Statement

ใน MySQL ไม่สามารถใช้ตัวแปรโดยตรงในคำสั่ง CREATE USER ได้ ต้องใช้ Dynamic SQL ผ่าน PREPARE, EXECUTE, และ DEALLOCATE PREPARE แทน

ขั้นตอนการสร้างผู้ใช้ด้วยตัวแปร

ขั้นตอนที่ 1: กำหนดตัวแปร username และ password

SET @UserName := 'John Doe';
SET @Password := 'John Doe 123456';

ขั้นตอนที่ 2: สร้างคำสั่ง SQL แบบไดนามิกด้วย CONCAT()

SET @CreationOfUser = CONCAT(
    'CREATE USER "', @UserName, '"@"localhost" IDENTIFIED BY "', @Password, '"'
);

ขั้นตอนที่ 3: เตรียมคำสั่ง (PREPARE)

PREPARE stmt FROM @CreationOfUser;

ขั้นตอนที่ 4: รันคำสั่ง (EXECUTE)

EXECUTE stmt;

ขั้นตอนที่ 5: ตรวจสอบผู้ใช้ที่สร้าง

SELECT user, host FROM mysql.user WHERE user = 'John Doe';

ขั้นตอนที่ 6: ปล่อยคำสั่งที่เตรียมไว้ (DEALLOCATE)

DEALLOCATE PREPARE stmt;

ตัวอย่างสมบูรณ์

-- 1. กำหนดตัวแปร
SET @UserName := 'NewUser';
SET @Password := 'SecurePass123';

-- 2. สร้างคำสั่ง SQL
SET @sql = CONCAT('CREATE USER "', @UserName, '"@"%" IDENTIFIED BY "', @Password, '"');

-- 3. เตรียมและรัน
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- 4. ให้สิทธิ์ (ถ้าต้องการ)
GRANT ALL PRIVILEGES ON *.* TO 'NewUser'@'%';
FLUSH PRIVILEGES;

ข้อสังเกตสำคัญ

  • ชื่อผู้ใช้ที่มีช่องว่าง ต้องอยู่ในเครื่องหมายคำพูดคู่ " "
  • @'%' อนุญาตให้เชื่อมต่อจากโฮสต์ใดๆ, @'localhost' จำกัดเฉพาะเครื่องเดียวกัน
  • MySQL 8.0+ ใช้ caching_sha2_password เป็นค่าเริ่มต้น อาจต้องระบุ plugin: IDENTIFIED WITH mysql_native_password BY 'password'
  • ควรใช้รหัสผ่านที่แข็งแกร่งและจำกัดสิทธิ์ให้เหมาะสม

กรณีใช้ใน Stored Procedure

DELIMITER //
CREATE PROCEDURE CreateUserDynamic(IN p_user VARCHAR(100), IN p_pass VARCHAR(100))
BEGIN
    SET @sql = CONCAT('CREATE USER "', p_user, '"@"%" IDENTIFIED BY "', p_pass, '"');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

-- เรียกใช้
CALL CreateUserDynamic('dynamic_user', 'dynamic_pass');