Conceda privilégios ** todos ** no banco de dados

611

Eu criei o banco de dados, por exemplo '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;

Agora eu posso entrar no banco de dados de qualquer lugar, mas não consigo criar tabelas.

Como conceder todos os privilégios nesse banco de dados e (no futuro) tabelas. Não consigo criar tabelas no banco de dados 'mydb'. Eu sempre recebo:

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
fonte
10
O que você ganha quando SHOW GRANTS FOR CURRENT_USER;
Diagonalbatman
5
Você já tentou correr FLUSH PRIVILEGES?
Romain
1
@ Andy Obrigado por "SHOW GRANTS FOR CURRENT_USER;" - isso me ajuda a ver meu erro de digitação.
marioosh
2
@Romain, flush privilegesnão é necessário quando você usa grantcomandos. x4
Pacerier
2
Você deve usar FLUSH PRIVILEGES;somente se você modificar as tabelas de permissões diretamente usando declarações como INSERT, UPDATEouDELETE
simhumileco

Respostas:

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

É assim que eu crio meus privilégios de "Superusuário" (embora eu normalmente especifique um host).

NOTA IMPORTANTE

Enquanto esta resposta pode resolver o problema de acesso, WITH GRANT OPTIONcria um usuário MySQL que pode editar as permissões de outros usuários .

O privilégio GRANT OPTION permite que você conceda a outros usuários ou remova de outros usuários os privilégios que você possui.

Por motivos de segurança, você não deve usar esse tipo de conta de usuário para nenhum processo ao qual o público tenha acesso (por exemplo, um site). É recomendável que você crie um usuário com apenas privilégios de banco de dados para esse tipo de uso.

diagonalbatman
fonte
35
@ Romain você realmente não está trazendo muita coisa para a tabela aqui - não nomeio meus usuários como myuser - o questionador estava simplesmente usando um nome de usuário como exemplo - usei o mesmo exemplo de nome de usuário para obter consistência.
Diagonalbatman
22
Justo. Mas é preciso também pensar nas outras pessoas, possivelmente iniciantes, que poderiam ler esta pergunta mais tarde. Não é o objetivo do SO também?
Romain
7
Também não acho que essa resposta seja boa. Ele concede privilégios de "administrador" em todos os bancos de dados e tabelas, o que não foi solicitado.
daks
5
Eu editei esta resposta para dizer mydb. * Em vez de . , já que é uma resposta amplamente votada e visualizada, e acredito que a segurança - especialmente com um bocado polido como o MySQL - é extremamente importante. Seria de esperar que um leitor investigasse os detalhes da resposta em vez de copiar e colar, mas eu gosto de viver na realidade ocasionalmente.
Jordânia
4
@Romain Os usuários que configuram um servidor MySQL provavelmente são inteligentes o suficiente para perceber que devem substituir myuserpor seu próprio nome de usuário personalizado.
AStopher
524

Esta é uma pergunta antiga, mas não acho que a resposta aceita seja segura. É bom para criar um super usuário, mas não é bom se você deseja conceder privilégios em um único banco de dados.

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

%parece não cobrir as comunicações de soquete, para que localhostserve. WITH GRANT OPTIONé bom apenas para o super usuário, caso contrário, geralmente é um risco de segurança.

A atualização para o MySQL 5.7+ parece que isso alerta sobre:

O uso da instrução GRANT para modificar as propriedades do usuário existentes que não sejam privilégios é preterido e será removido em uma versão futura. Use a instrução ALTER USER para esta operação.

Portanto, a configuração da senha deve ser feita com comandos separados. Agradecemos o comentário de @ scary-wombat.

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

Espero que isto ajude.

akostadinov
fonte
26
+1 por não incluir WITH GRANT OPTIONe segmentar um banco de dados especificado em vez de all ( *).
Adonis K.Kakoulidis
@IanBussieres a gramática de "% parece não cobrir as comunicações de soquete, para as quais o host local é" não é clara. O que isso realmente significa?
Thufir
2
@ Thufir, procure unix sockets. Ao usar o localhostcliente myslq no linux, tente usar um soquete unix em vez de uma conexão TCP com o servidor.
akostadinov
1
Observe que você provavelmente não precisa do primeiro comando, a menos que queira acessar de endereços IP externos ou de outros computadores na sub-rede local. Se o fizer, eu recomendaria o uso de comandos direcionados aos endereços IP específicos que você deseja permitir, como [email protected] (para um na sub-rede local), em vez de myuser @% em geral.
Evan Donovan
1
mysql> ALTER USUÁRIO 'root' @ 'localhost' IDENTIFICADO POR 'new_password';
Scary Wombat
121

Isso será útil para algumas pessoas:

Na linha de comando do MySQL:

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

Infelizmente, neste momento o newuser não tem permissões para fazer qualquer coisa com os bancos de dados. De fato, se o novo usuário tentar fazer login (com a senha, a senha), ele não poderá acessar o shell do MySQL.

Portanto, a primeira coisa a fazer é fornecer ao usuário acesso às informações necessárias.

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

Os asteriscos neste comando se referem ao banco de dados e à tabela (respectivamente) que eles podem acessar - esse comando específico permite ao usuário ler, editar, executar e executar todas as tarefas em todos os bancos de dados e tabelas.

Depois de finalizar as permissões que você deseja configurar para seus novos usuários, sempre certifique-se de recarregar todos os privilégios.

FLUSH PRIVILEGES;

Suas alterações agora estarão em vigor.

Para mais informações: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Se você não estiver familiarizado com a linha de comando, poderá usar um cliente como MySQL Workbench , Navicat ou SQLyog

BrenBarn
fonte
5
flush privilegesnão é necessário quando você usa grantcomandos. x4
Pacerier
1
Ou você atacado copiado de Linode, ou copiado de você: linode.com/docs/databases/mysql/...
I necessário para identificar novamente com o GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(estranho ..., mas é verdade)
rubo77
30

 1. Crie o banco de dados

CREATE DATABASE db_name;

 2. Crie o nome de usuário para o banco de dados db_name

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

 3. Use o banco de dados

USE db_name;

 4. Finalmente, você está no banco de dados db_name e, em seguida, execute os comandos como criar, selecionar e inserir operações.

Bhavnesh
fonte
Hoje, isso me deu o aviso "O uso da instrução GRANT para modificar as propriedades do usuário existentes que não sejam privilégios é preterido e será removido em uma versão futura. Use a instrução ALTER USER para esta operação". Então, devo entender que devo criar um usuário e conceder privilégios agora?
Feltro #
Como você pode dizer ao MySQL que usernamedeve ter todos os privilégios, db_namemas não o DROP db_name;privilégio?
tonix 16/03
21

Este SQL concede em todos os bancos de dados, mas apenas privilégios básicos. Eles são suficientes para Drupal ou Wordpress e, como segurança, permitem uma conta de desenvolvedor para projetos locais.

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

Funciona para privilégios no esquema :)

Opcional: depois de mypasswdadicionarWITH GRANT OPTION

Glória holandesa
fonte
15

Eu consegui fazê-lo funcionar apenas adicionando GRANT OPTION, sem isso, sempre receber erro de permissão negada

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

Olá eu usei esse código para ter o super usuário no 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;

e depois

FLUSH PRIVILEGES;
gastonnina
fonte
11
flush privilegesnão é necessário quando você usa grantcomandos. x4
Pacerier
Nota: A lista exata na GRANTvaria entre versões do MySQL.
Rick James
6

Para acessar do servidor remoto apenas para o banco de dados mydb

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

Para acessar do servidor remoto para todos os bancos de dados.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
Desenvolvedor
fonte
4

Para conceder todos os privilégios no banco de dados: mydbao usuário myuser:, basta executar:

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

ou:

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

A PRIVILEGESpalavra-chave não é necessária.

Também não sei por que as outras respostas sugerem que IDENTIFIED BY 'password'seja colocado no final do comando. Eu acredito que não é necessário.

pgmank
fonte