Используйте хранимую процедуру для добавления пользователей в базу данных - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать хранимую процедуру, которая может предоставить пользователям доступ к базе данных.Идея состоит в том, что процедура будет принимать один параметр (заданное имя пользователя), а затем предоставлять пользователю доступ к базе данных.Итак, обычный запрос Mariadb для этого:

GRANT ALL ON databaseNameHere.* TO 'userNameHere'@'%';

Проблема в том, что userNameHere должен быть в кавычках, чтобы выполнить этот запрос, поэтому мне нужно объединить кавычки взаданный параметр имени пользователя.Я подумал сделать это с DECLARE следующим образом:

DELIMITER $$
CREATE PROCEDURE GrantUserAccess(IN as_username CHAR(25)) 
BEGIN
  SET @sql = CONCAT("GRANT ALL ON archimodels.* TO '" as_username "'@'%'")
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$

DELIMITER ;

Я продолжаю сталкиваться с ошибкой:

В синтаксисе SQL есть ошибка;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '"' @ '%'") PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;EN 'в строке 3

Вот пример того, что я хочу сделать, единственная проблема - мне нужно объединить кавычки с именем пользователя https://www.oreilly.com/library/view/mysql-stored-procedure/0596100892/re39.html

1 Ответ

0 голосов
/ 07 февраля 2019

Есть пара неправильных вещей.

1) В фигурную кавычку и двойные кавычки "умных кавычек" вместо кавычек ASCII и двойных кавычек

2) включается содержимоепараметра или переменной процедуры в тексте оператора SQL нам нужно будет использовать динамический SQL PREPARE / EXECUTE / DEALLOCATE

Нам также необходимо убедиться, что переданный параметр является допустимым;оператор GRANT создаст пользователя без пароля, если пользователь не существует.И если параметр содержит символ одинарной кавычки, это сломает наш SQL, если мы не избежим его.Мы также могли бы рассмотреть возможность использования функции TRIM () для удаления любых начальных или конечных пробелов из параметра.

Примерно так:

DELIMITER $$

CREATE PROCEDURE GrantUserAccess(IN as_username CHAR(25)) 
BEGIN
  SET @sql = CONCAT('GRANT ALL ON databaseNameHere.* TO '''
               ,REPLACE(as_username,'''','''''')
               ,'''@''%''' );
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  SET @sql = '';
END$$

DELIMITER ;
...