Conceder ** todos ** privilegios en la base de datos

611

He creado una base de datos, por ejemplo, '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;

Ahora puedo iniciar sesión en la base de datos desde cualquier lugar, pero no puedo crear tablas.

Cómo otorgar todos los privilegios en esa base de datos y (en el futuro) tablas. No puedo crear tablas en la base de datos 'mydb'. Siempre obtengo:

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
fuente
10
¿Qué obtienes cuando MOSTRAS SUBVENCIONES PARA CURRENT_USER;
diagonalbatman
55
¿Has intentado correr FLUSH PRIVILEGES?
Romain
1
@Andy Gracias por "SHOW GRANTS FOR CURRENT_USER;" - Eso me ayuda a ver mi error tipográfico.
marioosh
2
@Romain, flush privilegesno es necesario cuando usa grantcomandos. x4
Pacerier
2
Debe utilizar FLUSH PRIVILEGES;sólo si se modifican las tablas de permisos directamente utilizando frases como INSERT, UPDATEoDELETE
simhumileco

Respuestas:

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

Así es como creo mis privilegios de "Súper Usuario" (aunque normalmente especificaría un host).

NOTA IMPORTANTE

Si bien esta respuesta puede resolver el problema del acceso, WITH GRANT OPTIONcrea un usuario MySQL que puede editar los permisos de otros usuarios .

El privilegio GRANT OPTION le permite otorgar a otros usuarios o eliminar de otros usuarios los privilegios que usted posee.

Por razones de seguridad, no debe usar este tipo de cuenta de usuario para ningún proceso al que el público tenga acceso (es decir, un sitio web). Se recomienda que cree un usuario con solo privilegios de base de datos para ese tipo de uso.

diagonalbatman
fuente
35
@Romain realmente no está aportando mucho a la tabla aquí, no llamo a mis usuarios myuser, el interrogador simplemente estaba usando un nombre de usuario como ejemplo, utilicé el mismo nombre de usuario de ejemplo para mantener la coherencia.
diagonalbatman
22
Lo suficientemente justo. Pero también hay que pensar en las otras personas, posiblemente novatos, que podrían venir a leer esta pregunta más adelante. ¿No es el punto de SO también?
Romain
77
Tampoco creo que esta respuesta sea la buena. Otorga privilegios de "administrador" en todas las bases de datos y todas las tablas, que no es lo que se solicitó.
daks
55
Edité esta respuesta para decir mydb. * En lugar de . , dado que es una respuesta tan ampliamente votada y muy votada, y creo que la seguridad, especialmente con un turrón pulido como MySQL, es extremadamente importante. Uno esperaría que un lector investigue los detalles de la respuesta en lugar de copiar y pegar, pero a veces me gusta vivir en la realidad.
Jordania
44
@Romain Los usuarios que configuran un servidor MySQL probablemente sean lo suficientemente inteligentes como para darse cuenta de que deberían reemplazarlos myusercon su propio nombre de usuario personalizado.
AStopher
524

Esta es una pregunta antigua, pero no creo que la respuesta aceptada sea segura. Es bueno para crear un súper usuario, pero no es bueno si desea otorgar privilegios en una sola base de datos.

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

%parece no cubrir las comunicaciones de socket, que localhostes para. WITH GRANT OPTIONsolo es bueno para el súper usuario, de lo contrario, generalmente es un riesgo de seguridad.

Parece que la actualización para MySQL 5.7+ advierte sobre:

El uso de la declaración GRANT para modificar las propiedades del usuario existente que no sean privilegios está en desuso y se eliminará en futuras versiones. Utilice la declaración ALTER USER para esta operación.

Por lo tanto, configurar la contraseña debe ser con comandos separados. Gracias por comentar de @ scary-wombat.

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

Espero que esto ayude.

akostadinov
fuente
26
+1 por no incluir WITH GRANT OPTIONy orientar una base de datos especificada en lugar de todas ( *).
Adonis K. Kakoulidis
@IanBussieres la gramática de "% parece no cubrir las comunicaciones de socket, que es para el host local" no está claro. ¿Qué significa esto realmente?
Thufir
2
@Thufir, busca unix sockets. Cuando se usa el localhostcliente myslq en linux se intenta usar un socket unix en lugar de una conexión TCP al servidor.
akostadinov
1
Tenga en cuenta que probablemente no necesite el primer comando a menos que desee acceder desde direcciones IP externas o desde otras computadoras en la subred local. Si lo hace, recomendaría el uso de comandos dirigidos a las direcciones IP específicas que desea permitir, como [email protected] (para uno en la subred local), en lugar de myuser @% en general.
Evan Donovan
1
mysql> ALTERAR USUARIO 'root' @ 'localhost' IDENTIFICADO POR 'new_password';
Scary Wombat
121

Esto será útil para algunas personas:

Desde la línea de comando de MySQL:

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

Lamentablemente, en este punto, newuser no tiene permisos para hacer nada con las bases de datos. De hecho, si newuser incluso intenta iniciar sesión (con la contraseña, contraseña), no podrán acceder al shell de MySQL.

Por lo tanto, lo primero que debe hacer es proporcionar al usuario acceso a la información que necesitará.

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

Los asteriscos en este comando se refieren a la base de datos y la tabla (respectivamente) a las que pueden acceder; este comando específico permite al usuario leer, editar, ejecutar y realizar todas las tareas en todas las bases de datos y tablas.

Una vez que haya finalizado los permisos que desea configurar para sus nuevos usuarios, asegúrese siempre de volver a cargar todos los privilegios.

FLUSH PRIVILEGES;

Sus cambios ahora estarán vigentes.

Para más información: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Si no se siente cómodo con la línea de comandos, puede usar un cliente como MySQL workbench , Navicat o SQLyog

BrenBarn
fuente
55
flush privilegesno es necesario cuando usa grantcomandos. x4
Pacerier
1
O copias al por mayor de Linode, o copiaron de usted: linode.com/docs/databases/mysql/…
Necesitaba identificarme nuevamente con GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(extraño ... pero cierto)
rubo77
30

 1. Crear la base de datos

CREATE DATABASE db_name;

 2. Cree el nombre de usuario para la base de datos db_name

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

 3. Usa la base de datos

USE db_name;

 4. Finalmente está en la base de datos db_name y luego ejecuta los comandos como crear, seleccionar e insertar operaciones.

Bhavnesh
fuente
Hoy esto me dio la advertencia "El uso de la declaración GRANT para modificar las propiedades de los usuarios existentes que no sean privilegios está en desuso y se eliminará en futuras versiones. Use la declaración ALTER USER para esta operación". Entonces, ¿debo entender que debo crear un usuario y luego otorgar privilegios ahora?
Felwithe
¿Cómo puede decirle a MySQL que usernamedebería tener todos los privilegios db_namepero no el DROP db_name;privilegio?
tonix
21

Este SQL otorga en todas las bases de datos pero solo privilegios básicos. Son suficientes para Drupal o Wordpress y, como detalle, permite una cuenta de desarrollador para proyectos locales.

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

Funciona por privilegios en el esquema :)

Opcional: después de mypasswdque pueda agregarWITH GRANT OPTION

Gloria holandesa
fuente
15

Pude hacer que funcione solo agregando GRANT OPTION, sin eso siempre recibo permiso denegado

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

Hola, usé este código para tener el superusuario en 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;

y entonces

FLUSH PRIVILEGES;
gastonnina
fuente
11
flush privilegesno es necesario cuando usa grantcomandos. x4
Pacerier
Nota: La lista exacta en el GRANTvaría entre las versiones de MySQL.
Rick James el
6

Para acceder desde el servidor remoto a la base de datos mydb solamente

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

Para acceder desde el servidor remoto a todas las bases de datos.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
Desarrollador
fuente
4

Para otorgar todos los privilegios en la base de datos: mydbal usuario: myusersimplemente ejecute:

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

o:

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

La PRIVILEGESpalabra clave no es necesaria.

Además, no sé por qué las otras respuestas sugieren que IDENTIFIED BY 'password'se ponga al final del comando. Creo que no es obligatorio.

pgmank
fuente