Создать пользователя MySQL с помощью процедуры хранения (режим сервера)

#mysql #vb.net #stored-procedures

#mysql #vb.net #хранимые процедуры

Вопрос:

Я успешно создал имя пользователя = ‘root’ и хост = ‘127 .0.0.1 ‘, используйте команду mysql (режим клиента) следующим образом:

 sql = String.Format("CREATE USER '{0}'@'{1}' IDENTIFIED BY '{2}'; GRANT ALL PRIVILEGES ON * . * TO '{0}'@'{1}' IDENTIFIED BY '{2}' WITH GRANT OPTION;", userName, serverHost, userPassword)
  

Когда в приведенном выше скрипте я меняю его на процедуру хранения (режим сервера), как показано ниже, я обнаружил следующую ошибку: (Ошибка 1064 — У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘pass’ в строке 1)

 ScriptExec(String.Format("DROP PROCEDURE IF EXISTS mySchema.SP_CreateUser $$"  
                         "CREATE DEFINER=root@localhost PROCEDURE {0}.SP_CreateUser(IN userName VARCHAR(250), IN serverHost VARCHAR(250), IN userPassword VARCHAR(250)) "  
                         "BEGIN "  
                         "SET @buf = CONCAT('CREATE USER ',userName,'@',serverHost,' IDENTIFIED BY ',userPassword); PREPARE stmt FROM @buf; EXECUTE stmt; DEALLOCATE PREPARE stmt;"  
                         "SET @buf1 = CONCAT('GRANT ALL PRIVILEGES ON * . * TO ',userName,'@',serverHost,' IDENTIFIED BY ',userPassword,' WITH GRANT OPTION'); PREPARE stmt1 FROM @buf1; EXECUTE stmt1; DEALLOCATE PREPARE stmt1;"  
                         "END $$"))

Public Function ScriptExec(ByVal sql As String) As Boolean
    Dim stsResult As Boolean = Nothing
    Dim has As Integer = Nothing
    Dim script As New MySqlScript(objCon, sql)
    script.Delimiter = "$$"
    Try
        has = script.Execute()
        If has > 0 Then stsResult = True
    Catch ex As MySqlException
        MessageBox.Show("Error occurred in ScriptExec Function" amp; vbCrLf amp; ex.Number amp; " – " amp; ex.Message)
    Finally
        script.Delimiter = ";"
    End Try
    Return stsResult
End Function
  

Есть ли решение моей проблемы выше?

Спасибо и с наилучшими пожеланиями,

Юдха

Ответ №1:

Разве вы не пропускаете

 DELIMITER $$
  

инструкция в начале вашего SQL-кода? Без этого движок не будет знать, как интерпретировать $$ .

Комментарии:

1. Я использовал скрипт. Разделитель = «$$» в функции ScriptExec. Возможна ошибка, поскольку формат CREATE USER username@serverHost, должен СОЗДАВАТЬ USER ‘username’@’serverHost’. Там есть открывающие и закрывающие кавычки. Как мне использовать открывающие и закрывающие кавычки в CONCAT, потому что я использую переменную для имени пользователя и хоста сервера?

2. Верно, чего я и ожидал. Я меняю свое имя пользователя, ‘@’, пароль пользователя на КАВЫЧКИ (username), ‘@’, QUOTE (serverHost) и ‘IDENTIFIED BY’, пароль пользователя) на ‘IDENTIFIED BY’, ЦИТАТА (пароль пользователя)). Теперь все функционирует нормально. Спасибо, что помогли мне. //Yudha