MySQL Benutzer erstellen, wenn nicht vorhanden

94

Ich habe eine Abfrage, um die MySQL-Benutzerliste auf das Erstellen eines neuen Benutzers zu überprüfen.

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

Aber ich bekomme diesen Fehler:

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
sweb
quelle

Antworten:

275

In 5.7.6 und höher sollten Sie in der Lage sein, zu verwenden CREATE USER

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

Beachten Sie, dass die 5.7.6-Methode keine Berechtigungen erteilt.


Wenn Sie keine Version mit dieser Funktion verwenden (etwas unter 5.7.6), können Sie Folgendes tun:

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

Dadurch wird der Benutzer erstellt, wenn er nicht vorhanden ist


Beachten Sie, dass die GRANT ALLMethode unter MySQL 8 keinen Benutzer erstellt.

Ascherer
quelle
3
Ändert dies das Passwort, wenn der Benutzer existiert hat und ein anderes Passwort hatte?
m3z
5
Nevermind - beantwortete meine eigene Frage - ja, aber es ersetzt nicht den Benutzer, wenn der Host anders ist
m3z
1
@ m3z Wenn Sie einen Benutzer haben, der sich auf zwei verschiedenen Hosts anmelden kann, sind diese nicht derselbe Benutzer. Sie können unterschiedliche Berechtigungen, unterschiedliche Kennwörter und alles haben.
Ascherer
1
Ja @roundar, aber das hinterlässt Sicherheitslücken. Sei vorsichtig.
Ascherer
1
Es ist nur unsicher, wenn Sie kein Passwort @ B166ER angeben, was .... duh.
Ascherer
-3

ich benutze

SELECT EXISTS (SELECT DISTINCT userFROM mysql. userWHERE user= "Benutzername") als is_user

sollte 1 zurückgeben, wenn vorhanden, oder 0, wenn dies nicht der Fall ist

Ingocnito
quelle
2
Die Frage ist nicht, wie man prüft, sondern wie man erstellt
VladL