ใน 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');