Concedi ** tutti ** i privilegi sul database


611

Ho creato un database, ad esempio "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;

Ora posso accedere al database da qualsiasi luogo, ma non riesco a creare tabelle.

Come concedere tutti i privilegi su quel database e (in futuro) tabelle. Non riesco a creare tabelle nel database "mydb". Ottengo sempre:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'

10
Cosa ottieni quando MOSTRA SOVVENZIONI PER CURRENT_USER;
diagonalbatman,

5
Hai provato a correre FLUSH PRIVILEGES?
Romain,

1
@Andy Grazie per "SHOW GRANTS FOR CURRENT_USER;" - questo mi aiuta a vedere il mio errore di battitura.
marioosh,

2
@Romain, flush privilegesnon è necessario quando si utilizzano i grantcomandi. x4
Pacerier

2
Si dovrebbe usare FLUSH PRIVILEGES;solo se si modificano le tabelle grant utilizzando direttamente affermazioni come INSERT, UPDATEoDELETE
simhumileco

Risposte:


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

È così che creo i miei privilegi di "Super utente" (anche se normalmente specificare un host).

NOTA IMPORTANTE

Mentre questa risposta può risolvere il problema di accesso, WITH GRANT OPTIONcrea un utente MySQL che può modificare le autorizzazioni di altri utenti .

Il privilegio GRANT OPTION ti consente di assegnare ad altri utenti o rimuovere da altri utenti quei privilegi che possiedi tu.

Per motivi di sicurezza, non utilizzare questo tipo di account utente per qualsiasi processo a cui il pubblico avrà accesso (ovvero un sito Web). Si consiglia di creare un utente con solo i privilegi di database per quel tipo di utilizzo.


35
@Romine non stai davvero portando molto al tavolo qui - non chiamo i miei utenti myuser - l'interrogante stava semplicemente usando un nome utente come esempio - ho usato lo stesso nome utente di esempio per coerenza.
diagonalbatman,

22
Giusto. Ma bisogna anche pensare alle altre persone, forse ai neofiti, che potrebbero venire a leggere questa domanda in seguito. Non è anche il punto di SO?
Romain,

7
Inoltre non penso che questa risposta sia buona. Dà privilegi di "amministratore" su tutti i database e tutte le tabelle, cosa che non è stata chiesta.
daks

5
Ho modificato questa risposta per dire mydb. * Invece di . , dal momento che è una risposta così ampiamente votata e considerata, e credo che la sicurezza - specialmente con un turd lucido come MySQL - sia estremamente importante. Si spera che un lettore indaghi sui dettagli della risposta piuttosto che copiare e incollare, ma mi piace vivere occasionalmente nella realtà.
Giordania,

4
@Romain Gli utenti che configurano un server MySQL sono probabilmente abbastanza intelligenti da rendersi conto che dovrebbero sostituire myusercon il proprio nome utente personalizzato.
Più tardi, il

524

Questa è una vecchia domanda ma non credo che la risposta accettata sia sicura. È utile per la creazione di un superutente ma non è utile se si desidera concedere i privilegi su un singolo database.

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

%sembra non coprire le comunicazioni socket, che localhostè per. WITH GRANT OPTIONè buono solo per il superutente, altrimenti è di solito un rischio per la sicurezza.

L'aggiornamento per MySQL 5.7+ sembra che questo avverta di:

L'uso dell'istruzione GRANT per modificare le proprietà dell'utente esistente diverso dai privilegi è obsoleto e verrà rimosso nella versione futura. Utilizzare l'istruzione ALTER USER per questa operazione.

Quindi l'impostazione della password dovrebbe essere con comandi separati. Grazie al commento di @ scary-wombat.

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

Spero che sia di aiuto.


26
+1 per non includere WITH GRANT OPTIONe scegliere come target un database specificato anziché all ( *).
Adonis K. Kakoulidis,

@IanBussieres la grammatica di "% sembra non coprire le comunicazioni socket, che l'host locale è per" non è chiara. Cosa significa veramente?
Giovedì

2
@Thufir, cerca unix sockets. Quando si utilizza localhostmyslq client su Linux, si tenta di utilizzare un socket unix invece di una connessione TCP al server.
Akostadinov,

1
Si noti che probabilmente non è necessario il primo comando a meno che non si desideri accedere da indirizzi IP esterni o da altri computer nella sottorete locale. In tal caso, consiglierei di utilizzare i comandi indirizzati agli indirizzi IP specifici che si desidera consentire, ad esempio myuser@192.168.0.1 (per uno sulla sottorete locale), piuttosto che myuser @% in generale.
Evan Donovan,

1
mysql> ALTER USER 'root' @ 'localhost' IDENTIFICATO DA 'new_password';
Scary Wombat,

121

Questo sarà utile per alcune persone:

Dalla riga di comando di MySQL:

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

Purtroppo, a questo punto newuser non ha i permessi per fare nulla con i database. Infatti, se newuser prova anche ad accedere (con password, password), non sarà in grado di raggiungere la shell di MySQL.

Pertanto, la prima cosa da fare è fornire all'utente l'accesso alle informazioni di cui avranno bisogno.

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

Gli asterischi in questo comando si riferiscono al database e alla tabella (rispettivamente) a cui possono accedere; questo comando specifico consente all'utente di leggere, modificare, eseguire ed eseguire tutte le attività su tutti i database e le tabelle.

Dopo aver finalizzato le autorizzazioni che si desidera impostare per i nuovi utenti, assicurarsi sempre di ricaricare tutti i privilegi.

FLUSH PRIVILEGES;

Le tue modifiche ora saranno attive.

Per maggiori informazioni: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Se non hai dimestichezza con la riga di comando, puoi utilizzare un client come MySQL workbench , Navicat o SQLyog


5
flush privilegesnon è necessario quando si utilizzano i grantcomandi. x4
Pacerier

1
O hai copiato all'ingrosso da Linode o hai copiato da te: linode.com/docs/database/mysql/…

Avevo bisogno di identificarmi di nuovo con GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(strano ..., ma vero)
rubo77

30

 1. Creare il database

CREATE DATABASE db_name;

 2. Creare il nome utente per il database nome_db

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

 3. Utilizzare il database

USE db_name;

 4. Finalmente vi trovate nel database nome_db e quindi eseguite i comandi come creare, selezionare e inserire le operazioni.


Oggi questo mi ha dato l'avvertimento "L'uso dell'istruzione GRANT per modificare le proprietà dell'utente esistente diverso dai privilegi è obsoleto e verrà rimosso nella versione futura. Utilizzare l'istruzione ALTER USER per questa operazione". Quindi dovrei capire che dovrei creare un utente, quindi concedere i privilegi, ora?
Felwithe

Come puoi dire a MySQL che usernamedovrebbe avere tutti i privilegi db_namema non il DROP db_name;privilegio?
tonix

21

Questo SQL garantisce tutti i database ma solo i privilegi di base. Sono sufficienti per Drupal o Wordpress e, per semplicità, consentono un account sviluppatore per progetti locali.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Funziona per i privilegi sullo schema :)

Opzionale: dopo mypasswdaverlo aggiuntoWITH GRANT OPTION


15

Potrei farlo funzionare solo aggiungendo GRANT OPTION, senza che riceva sempre errore di autorizzazione negata

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

14

Ciao ho usato questo codice per avere il superutente in 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 poi

FLUSH PRIVILEGES;

11
flush privilegesnon è necessario quando si utilizzano i grantcomandi. x4
Pacerier

Nota: l'elenco esatto GRANTvaria tra le versioni di MySQL.
Rick James,

6

Per accedere dal server remoto solo al database mydb

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

Per accedere dal server remoto a tutti i database.

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

4

Per concedere tutti i privilegi sul database: mydball'utente myuser:, basta eseguire:

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

o:

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

La PRIVILEGESparola chiave non è necessaria.

Inoltre non so perché le altre risposte suggeriscano che l' IDENTIFIED BY 'password'essere messo alla fine del comando. Credo che non sia richiesto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.