Gewähren Sie ** alle ** Berechtigungen für die Datenbank

611

Ich habe eine Datenbank erstellt, zum Beispiel '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;

Jetzt kann ich mich von überall in die Datenbank einloggen, aber keine Tabellen erstellen.

So gewähren Sie alle Berechtigungen für diese Datenbank und (in Zukunft) Tabellen. Ich kann keine Tabellen in der 'mydb'-Datenbank erstellen. Ich bekomme immer:

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
quelle
10
Was bekommen Sie, wenn Sie GRANTS FOR CURRENT_USER ZEIGEN?
Diagonalbatman
5
Hast du versucht zu rennen FLUSH PRIVILEGES?
Romain
1
@Andy Danke für "SHOW GRANTS FOR CURRENT_USER;" - Das hilft mir, meinen Tippfehler zu erkennen.
Marioosh
2
@Romain, flush privilegeswird nicht benötigt, wenn Sie grantBefehle verwenden. x4
Pacerier
2
Sie sollten verwenden FLUSH PRIVILEGES;nur , wenn Sie die Berechtigungstabellen direkt wie die Verwendung von Aussagen zu ändern INSERT, UPDATEoderDELETE
simhumileco

Antworten:

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

Auf diese Weise erstelle ich meine "Super User" -Rechte (obwohl ich normalerweise einen Host angeben würde).

WICHTIGE NOTIZ

Während diese Antwort das Problem des Zugriffs lösen kann, WITH GRANT OPTIONwird ein MySQL-Benutzer erstellt , der die Berechtigungen anderer Benutzer bearbeiten kann .

Mit der Berechtigung GRANT OPTION können Sie anderen Benutzern die Berechtigungen erteilen oder von anderen Benutzern entfernen, die Sie selbst besitzen.

Aus Sicherheitsgründen sollten Sie diese Art von Benutzerkonto nicht für Prozesse verwenden, auf die die Öffentlichkeit Zugriff hat (z. B. eine Website). Es wird empfohlen, einen Benutzer mit nur Datenbankberechtigungen für diese Art der Verwendung zu erstellen .

Diagonalbatman
quelle
35
@Romain Sie bringen hier nicht wirklich viel auf den Tisch - ich nenne meinen Benutzer nicht myuser - der Fragesteller hat einfach einen Benutzernamen als Beispiel verwendet - ich habe den gleichen Beispielbenutzernamen aus Konsistenzgründen verwendet.
Diagonalbatman
22
Meinetwegen. Man muss aber auch an die anderen Leute denken, möglicherweise an Neulinge, die diese Frage später lesen könnten. Ist es nicht auch der Sinn von SO?
Romain
7
Ich denke auch nicht, dass diese Antwort die gute ist. Es gibt "Administrator" -Berechtigungen für alle Datenbanken und alle Tabellen, was nicht gefragt wurde.
Daks
5
Ich habe diese Antwort bearbeitet, um mydb. * Statt zu sagen . , da es sich um eine so weit verbreitete und angesehene Antwort handelt und ich glaube, dass Sicherheit - insbesondere bei einem polierten Trottel wie MySQL - äußerst wichtig ist. Man würde hoffen, dass ein Leser die Details der Antwort untersucht, anstatt sie zu kopieren und einzufügen, aber ich lebe gelegentlich gerne in der Realität.
Jordanien
4
@Romain Benutzer, die einen MySQL-Server einrichten, sind wahrscheinlich intelligent genug, um zu erkennen, dass sie durch myuserihren eigenen benutzerdefinierten Benutzernamen ersetzt werden sollten.
AStopher
524

Dies ist eine alte Frage, aber ich denke nicht, dass die akzeptierte Antwort sicher ist. Es ist gut zum Erstellen eines Superusers, aber nicht gut, wenn Sie Berechtigungen für eine einzelne Datenbank gewähren möchten.

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

%scheint nicht die Socket-Kommunikation abzudecken, für die das localhostist. WITH GRANT OPTIONist nur gut für den Superuser, sonst ist es in der Regel ein Sicherheitsrisiko.

Das Update für MySQL 5.7+ scheint Folgendes zu warnen:

Die Verwendung der GRANT-Anweisung zum Ändern anderer Eigenschaften anderer Benutzer als Berechtigungen ist veraltet und wird in zukünftigen Versionen entfernt. Verwenden Sie für diesen Vorgang die Anweisung ALTER USER.

Das Einstellen des Passworts sollte daher mit separaten Befehlen erfolgen. Dank Kommentar von @ beängstigend-wombat.

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

Hoffe das hilft.

akostadinov
quelle
26
+1 für das Nichteinschließen WITH GRANT OPTIONund Ausrichten einer angegebenen Datenbank anstelle von all ( *).
Adonis K. Kakoulidis
@IanBussieres Die Grammatik von "% scheint keine Socket-Kommunikation abzudecken, für die der Localhost ist" ist unklar. Was bedeutet das eigentlich?
Thufir
2
@Thufir, suche nach unix sockets. Bei Verwendung von localhostmyslq client unter Linux wird versucht, einen Unix-Socket anstelle einer TCP-Verbindung zum Server zu verwenden.
Akostadinov
1
Beachten Sie, dass Sie den ersten Befehl wahrscheinlich nur benötigen, wenn Sie von externen IP-Adressen oder von anderen Computern im lokalen Subnetz aus zugreifen möchten. In diesem Fall würde ich empfehlen, Befehle zu verwenden, die auf die spezifischen IP-Adressen abzielen, die Sie zulassen möchten, z. B. [email protected] (für einen im lokalen Subnetz), anstatt myuser @% im Allgemeinen.
Evan Donovan
1
mysql> ALTER USER 'root' @ 'localhost' IDENTIFIED BY 'new_password';
Scary Wombat
121

Dies wird für einige Leute hilfreich sein:

Über die MySQL-Befehlszeile:

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

Leider hat der neue Benutzer zu diesem Zeitpunkt keine Berechtigung, etwas mit den Datenbanken zu tun. Wenn sich newuser sogar versucht, sich anzumelden (mit dem Passwort, dem Passwort), kann er die MySQL-Shell nicht erreichen.

Daher müssen Sie dem Benutzer zunächst Zugriff auf die benötigten Informationen gewähren.

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

Die Sternchen in diesem Befehl beziehen sich auf die Datenbank bzw. die Tabelle, auf die sie zugreifen können. Mit diesem speziellen Befehl kann der Benutzer alle Aufgaben in allen Datenbanken und Tabellen lesen, bearbeiten, ausführen und ausführen.

Wenn Sie die Berechtigungen festgelegt haben, die Sie für Ihre neuen Benutzer einrichten möchten, müssen Sie immer alle Berechtigungen neu laden.

FLUSH PRIVILEGES;

Ihre Änderungen werden nun wirksam.

Weitere Informationen: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Wenn Sie mit der Befehlszeile nicht vertraut sind, können Sie einen Client wie MySQL Workbench , Navicat oder SQLyog verwenden

BrenBarn
quelle
5
flush privilegeswird nicht benötigt, wenn Sie grantBefehle verwenden. x4
Pacerier
1
Entweder haben Sie Großhandel von Linode kopiert, oder sie haben von Ihnen kopiert: linode.com/docs/databases/mysql/…
Ich musste mich wieder identifizieren mit GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(seltsam ..., aber wahr)
rubo77
30

 1. Erstellen Sie die Datenbank

CREATE DATABASE db_name;

 2. Erstellen Sie den Benutzernamen für die Datenbank Datenbankname

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

 3. Verwenden Sie die Datenbank

USE db_name;

 4. Schließlich befinden Sie sich in der Datenbank db_name und führen die Befehle wie Erstellen, Auswählen und Einfügen von Operationen aus.

Bhavnesh
quelle
Dies gab mir heute die Warnung "Die Verwendung der GRANT-Anweisung zum Ändern anderer Eigenschaften anderer Benutzer als Berechtigungen ist veraltet und wird in zukünftigen Versionen entfernt. Verwenden Sie für diesen Vorgang die Anweisung ALTER USER." Sollte ich also verstehen, dass ich jetzt einen Benutzer erstellen und dann Berechtigungen erteilen sollte?
Felwithe
Wie können Sie MySQL mitteilen, usernamedass alle Berechtigungen aktiviert sein sollen, db_namejedoch nicht die DROP db_name;Berechtigungen?
Tonix
21

Diese SQL gewährt alle Datenbanken, aber nur grundlegende Berechtigungen. Sie reichen für Drupal oder Wordpress und ermöglichen es einem Entwicklerkonto für lokale Projekte.

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

Funktioniert für Berechtigungen für Schema :)

Optional: nachdem mypasswdSie hinzufügen könnenWITH GRANT OPTION

Niederländischer Ruhm
quelle
15

Ich konnte es nur durch Hinzufügen zum Laufen bringen GRANT OPTION, ohne dass immer die Erlaubnis verweigert wurde

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

Hallo, ich habe diesen Code verwendet, um den Superuser in MySQL zu haben

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;

und dann

FLUSH PRIVILEGES;
Gastonnina
quelle
11
flush privilegeswird nicht benötigt, wenn Sie grantBefehle verwenden. x4
Pacerier
Hinweis: Die genaue Liste in GRANTvariiert zwischen den Versionen von MySQL.
Rick James
6

Nur Zugriff vom Remote-Server auf die MyDB-Datenbank

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

Zugriff vom Remote-Server auf alle Datenbanken.

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

Um mydbdem Benutzer alle Berechtigungen in der Datenbank zu erteilen: Führen Sie myusereinfach Folgendes aus:

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

oder:

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

Das PRIVILEGESSchlüsselwort ist nicht erforderlich.

Ich weiß auch nicht, warum die anderen Antworten darauf hindeuten, dass IDENTIFIED BY 'password'das Ende des Befehls gesetzt wird. Ich glaube, dass es nicht erforderlich ist.

pgmank
quelle