110 votes

mysql créer un utilisateur s'il n'existe pas

J'ai une requête pour vérifier la liste des utilisateurs mysql pour créer un nouvel utilisateur.

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

Mais je reçois cette erreur :

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

309voto

Ascherer Points 3645

Dans les versions 5.7.6 et supérieures, vous devriez pouvoir utiliser CREATE USER

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

Notez que la méthode 5.7.6 n'accorde pas réellement de permissions.


Si vous n'utilisez pas une version qui possède cette capacité (une version inférieure à 5.7.6), vous pouvez procéder comme suit :

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

Ceci créera l'utilisateur s'il n'existe pas encore.


Notez que si vous êtes sous MySQL 8, l'option GRANT ALL ne créera pas d'utilisateur.

1voto

fancyPants Points 17708

Vous ne pouvez pas utiliser IF() dans une simple requête comme celle-ci. Il ne peut être utilisé qu'entre BEGIN y END c'est-à-dire dans des procédures ou des fonctions stockées.

Exemple :

drop procedure if exists createUser;
delimiter $$
create procedure createUser(username varchar(50), pw varchar(50))
begin
IF (SELECT EXISTS(SELECT 1 FROM `mysql`.`user` WHERE `user` = username)) = 0 THEN
    begin
    set @sql = CONCAT('CREATE USER ', username, '@\'localhost\' IDENTIFIED BY \'', pw, '\'');
    prepare stmt from @sql;
    execute stmt;
    deallocate prepare stmt;
    end;
END IF;
end $$
delimiter ;

Ensuite, vous pouvez l'exécuter avec :

call createUser('someuser', 'somepassword')

0voto

Pankaj Points 926

Vous ne pouvez pas utiliser IF THEN dans les déclarations, vérifiez ici. http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if

pour l'instruction IF et les fonctions IF().

-4voto

ingocnito Points 9

J'utilise

SELECT EXISTS (SELECT DISTINCT user DE mysql . useruser = "nom d'utilisateur") as is_user

doit retourner 1 s'il existe ou 0 s'il n'existe pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X