Accordez ** tous ** les privilèges sur la base de données

611

J'ai créé une base de données, par exemple «mydb».

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

Maintenant, je peux me connecter à la base de données de partout, mais je ne peux pas créer de tables.

Comment accorder tous les privilèges sur cette base de données et (à l'avenir) les tables. Je ne peux pas créer de tables dans la base de données 'mydb'. Je reçois toujours:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'
marioosh
la source
10
Qu'obtenez-vous lorsque vous affichez des subventions pour CURRENT_USER;
diagonalbatman
5
Avez-vous essayé de courir FLUSH PRIVILEGES?
Romain
1
@Andy Merci pour "AFFICHER LES SUBVENTIONS POUR CURRENT_USER;" - cela m'aide à voir ma faute de frappe.
marioosh
2
@Romain, flush privilegesn'est pas nécessaire lorsque vous utilisez des grantcommandes. x4
Pacerier
2
Vous devez utiliser FLUSH PRIVILEGES;uniquement si vous modifiez les tables de droits directement en utilisant des déclarations telles que INSERT, UPDATEouDELETE
simhumileco

Réponses:

910
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

C'est ainsi que je crée mes privilèges de "super utilisateur" (bien que je spécifierais normalement un hôte).

NOTE IMPORTANTE

Bien que cette réponse puisse résoudre le problème d'accès, WITH GRANT OPTIONcrée un utilisateur MySQL qui peut modifier les autorisations des autres utilisateurs .

Le privilège GRANT OPTION vous permet d'accorder à d'autres utilisateurs ou de retirer à d'autres utilisateurs les privilèges que vous possédez vous-même.

Pour des raisons de sécurité, vous ne devez pas utiliser ce type de compte d'utilisateur pour tout processus auquel le public aura accès (c'est-à-dire un site Web). Il est recommandé de créer un utilisateur avec uniquement des privilèges de base de données pour ce type d'utilisation.

diagonalbatman
la source
35
@Romain vous n'apportez pas vraiment beaucoup à la table ici - je ne nomme pas mes utilisateurs myuser - l'interrogateur utilisait simplement un nom d'utilisateur comme exemple - j'ai utilisé le même exemple de nom d'utilisateur pour la cohérence.
diagonalbatman
22
C'est suffisant. Mais il faut aussi penser aux autres personnes, peut-être des débutants, qui pourraient venir lire cette question plus tard. N'est-ce pas aussi le but de SO?
Romain
7
Je ne pense pas non plus que cette réponse soit la bonne. Il donne des privilèges "administrateur" sur toutes les bases de données et toutes les tables, ce qui n'est pas ce qui a été demandé.
daks
5
J'ai modifié cette réponse pour dire mydb. * Au lieu de . , car c'est une réponse tellement largement votée et vue, et je pense que la sécurité - en particulier avec un étalon poli comme MySQL - est extrêmement importante. On pourrait espérer qu'un lecteur enquêterait sur les détails de la réponse plutôt que de copier-coller, mais j'aime vivre dans la réalité de temps en temps.
Jordan
4
Les utilisateurs @Romain qui configurent un serveur MySQL sont probablement assez intelligents pour se rendre compte qu'ils doivent les remplacer myuserpar leur propre nom d'utilisateur personnalisé.
AStopher
524

C'est une vieille question mais je ne pense pas que la réponse acceptée soit sûre. C'est bon pour créer un super utilisateur mais pas bon si vous voulez accorder des privilèges sur une seule base de données.

grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

%semble ne pas couvrir les communications par socket, c'est localhostpour ça . WITH GRANT OPTIONn'est bon que pour le super utilisateur, sinon c'est généralement un risque pour la sécurité.

La mise à jour pour MySQL 5.7+ semble comme ceci met en garde contre:

L'utilisation de l'instruction GRANT pour modifier les propriétés de l'utilisateur existant autres que les privilèges est obsolète et sera supprimée dans la prochaine version. Utilisez l'instruction ALTER USER pour cette opération.

La définition du mot de passe doit donc se faire avec des commandes distinctes. Merci au commentaire de @ scary-wombat.

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

J'espère que cela t'aides.

akostadinov
la source
26
+1 pour ne pas inclure WITH GRANT OPTIONet cibler une base de données spécifiée au lieu de tout ( *).
Adonis K. Kakoulidis
@IanBussieres la grammaire de "% semble ne pas couvrir les communications par socket, à laquelle l'hôte local est destiné" n'est pas claire. Qu'est-ce que cela signifie réellement?
Thufir
2
@Thufir, recherchez unix sockets. Lorsque vous localhostutilisez le client myslq sous linux, vous essayez d'utiliser un socket unix au lieu d'une connexion TCP au serveur.
akostadinov
1
Notez que vous n'avez probablement pas besoin de la première commande sauf si vous souhaitez accéder à partir d'adresses IP externes ou d'autres ordinateurs sur le sous-réseau local. Si vous le faites, je recommanderais d'utiliser des commandes qui ciblent les adresses IP spécifiques que vous souhaitez autoriser, telles que [email protected] (pour une sur le sous-réseau local), plutôt que myuser @% en général.
Evan Donovan
1
mysql> ALTER USER 'root' @ 'localhost' IDENTIFIED BY 'new_password';
Scary Wombat
121

Cela sera utile pour certaines personnes:

Depuis la ligne de commande MySQL:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

Malheureusement, à ce stade, newuser n'a aucune autorisation pour faire quoi que ce soit avec les bases de données. En fait, si un nouvel utilisateur essaie même de se connecter (avec le mot de passe, le mot de passe), il ne pourra pas atteindre le shell MySQL.

Par conséquent, la première chose à faire est de fournir à l'utilisateur l'accès aux informations dont il aura besoin.

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Les astérisques de cette commande font référence à la base de données et à la table (respectivement) auxquelles ils peuvent accéder. Cette commande spécifique permet à l'utilisateur de lire, modifier, exécuter et effectuer toutes les tâches dans toutes les bases de données et tables.

Une fois que vous avez finalisé les autorisations que vous souhaitez configurer pour vos nouveaux utilisateurs, assurez-vous toujours de recharger tous les privilèges.

FLUSH PRIVILEGES;

Vos modifications seront désormais en vigueur.

Pour plus d'informations: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Si vous n'êtes pas à l'aise avec la ligne de commande, vous pouvez utiliser un client comme MySQL Workbench , Navicat ou SQLyog

BrenBarn
la source
5
flush privilegesn'est pas nécessaire lorsque vous utilisez des grantcommandes. x4
Pacerier
1
Soit vous copiez en gros depuis Linode, soit ils copient depuis vous: linode.com/docs/databases/mysql/…
J'avais besoin de m'identifier à nouveau avec GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(étrange ..., mais vrai)
rubo77
30

 1. Créez la base de données

CREATE DATABASE db_name;

 2. Créez le nom d'utilisateur pour la base de données db_name

GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';

 3. Utilisez la base de données

USE db_name;

 4. Enfin, vous êtes dans la base de données db_name, puis exécutez les commandes comme créer, sélectionner et insérer des opérations.

Bhavnesh
la source
Aujourd'hui, cela m'a donné l'avertissement "L'utilisation de l'instruction GRANT pour modifier les propriétés de l'utilisateur existant autres que les privilèges est obsolète et sera supprimée dans la prochaine version. Utilisez l'instruction ALTER USER pour cette opération." Dois-je donc comprendre que je dois créer un utilisateur, puis accorder des privilèges, maintenant?
felwithe
Comment pouvez-vous dire à MySQL qui usernamedevrait avoir tous les privilèges db_namemais pas le DROP db_name;privilège?
tonix
21

Ce SQL accorde sur toutes les bases de données mais seulement des privilèges de base. Ils sont suffisants pour Drupal ou Wordpress et, pour plus de commodité, autorisent un compte développeur pour les projets locaux.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
s6712
la source
20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Fonctionne pour les privilèges sur le schéma :)

Facultatif: après avoir mypasswdajoutéWITH GRANT OPTION

Dutch Glory
la source
15

Je ne pouvais le faire fonctionner qu'en ajoutant GRANT OPTION, sans cela, toujours recevoir l'autorisation refusée erreur

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;
GnanaPrakash
la source
14

Bonjour j'ai utilisé ce code pour avoir le super utilisateur dans mysql

GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE,
    CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP,
    EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE,
    LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN,
    SUPER
        ON *.* TO mysql@'%'
    WITH GRANT OPTION;

et alors

FLUSH PRIVILEGES;
gastonnina
la source
11
flush privilegesn'est pas nécessaire lorsque vous utilisez des grantcommandes. x4
Pacerier
Remarque: La liste exacte dans le GRANTvarie entre les versions de MySQL.
Rick James
6

Pour accéder du serveur distant à la base de données mydb uniquement

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

Pour accéder à partir du serveur distant à toutes les bases de données.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
Développeur
la source
4

Pour accorder tous les privilèges sur la base de données: mydbà l'utilisateur :, myuserexécutez simplement:

GRANT ALL ON mydb.* TO 'myuser'@'localhost';

ou:

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

Le PRIVILEGESmot-clé n'est pas nécessaire.

Je ne sais pas non plus pourquoi les autres réponses suggèrent de le IDENTIFIED BY 'password'mettre à la fin de la commande. Je pense que ce n'est pas obligatoire.

pgmank
la source