mysql создает пользователя, если не существует


95

У меня есть запрос на проверку списка пользователей mysql для создания нового пользователя.

IF (SELECT EXISTS(SELECT 1 FROM `mysql`.`user` WHERE `user` = '{{ title }}')) = 0 THEN
    CREATE USER '{{ title }}'@'localhost' IDENTIFIED BY '{{ password }}'
END IF;

Но я получаю эту ошибку:

ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT EXISTS(SELECT 1 FROM `mysql`.`user` WHERE `user` = 'cms_localhost')) = 0 ' at line 1

Ответы:


278

В 5.7.6 и более поздних версиях вы сможете использовать CREATE USER

CREATE USER IF NOT EXISTS 'user'@'localhost' IDENTIFIED BY 'password';

Обратите внимание, что метод 5.7.6 фактически не предоставляет никаких разрешений.


Если вы не используете версию с такой возможностью (ниже 5.7.6), вы можете сделать следующее:

GRANT ALL ON `database`.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Это создаст пользователя, если он не существует


Обратите внимание: если вы используете MySQL 8, GRANT ALLметод не создаст пользователя.


3
Изменит ли это пароль, если пользователь существовал и имел другой пароль?
m3z

5
Nevermind - ответил на мой собственный вопрос - да, это так - но он не заменяет пользователя, если хост другой
m3z

1
@ m3z технически, если у вас есть пользователь, который может войти в систему на двух разных хостах, это не один и тот же пользователь. У них могут быть разные разрешения, разные пароли и все такое.
Ascherer

1
Да, @roundar, однако это оставляет дыры в безопасности. Знайте.
Ascherer

1
Это небезопасно только в том случае, если вы не укажете пароль @ B166ER, который .... ну.
Ascherer

-3

я использую

ВЫБРАТЬ СУЩЕСТВУЕТ (ВЫБРАТЬ DISTINCT userFROM mysql. userWHERE user= "username") как is_user

должен вернуть 1, если существует, или 0, если нет


2
вопрос не в том, как проверить, а в том, как создать
VladL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.