5

ストアドプロシージャコード:

CREATE DEFINER = `root` @`localhost` PROCEDURE `P_CreateUser3` (
  IN _Username NVARCHAR(30), IN _Password NVARCHAR(32), IN _DBName VARCHAR(20))
BEGIN
  CREATE USER _Username @'localhost' IDENTIFIED BY _Password ;
  GRANT SELECT, UPDATE, DELETE, INSERT 
  ON    _DBName.* 
  TO    _Username @'localhost' 
  WITH GRANT OPTION ;
END $$

エラーコード:1064SQL構文にエラーがあります。'_Passwordの近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。6行目の`pr'でSELECT、UPDATE、DELETE、INSERTを付与

お願い助けて。

4

2 に答える 2

4

残念ながら、CREATE USERまたはGRANTステートメントでのパスワードとしてのストアドプロシージャ入力パラメータの使用は、このバグサポートされていないものとして文書化されています。したがって、実際に試みたことを行うことはできません。

新しいパスワードを連結するために作成されたステートメントを作成することは可能ですが、これはPREPARE安全EXECUTEな方法はないため、お勧めしません。そのようにすると、ストアドプロシージャのセキュリティ上の利点がすべて失われます。CONCAT()

于 2012-07-06T20:06:58.487 に答える
0

変数はクエリで直接評価されないため、プリペアドステートメントを使用する必要があります。

DELIMITER $$

DROP PROCEDURE IF EXISTS `create_user`$$

CREATE PROCEDURE `create_user`(
    `user_name` VARCHAR(50), 
    `passwd` VARCHAR(255),
    `ip` VARCHAR(50)
)
BEGIN
   set @sql = concat("CREATE USER '",`user_name`,"'@'",`ip`,"' IDENTIFIED BY '",`passwd`,"'");
   PREPARE stmt1 FROM @sql;
   EXECUTE stmt1;
   DEALLOCATE PREPARE stmt1;

   set @sql = concat("GRANT ALL PRIVILEGES ON * . * TO '",`user_name`,"'@'",`ip`,"' ");
   PREPARE stmt2 FROM @sql;
   EXECUTE stmt2;
   DEALLOCATE PREPARE stmt2;

   FLUSH PRIVILEGES;
END$$

DELIMITER ;
于 2018-07-17T23:28:02.830 に答える