Wie kann man alle Benutzer kennen, die auf eine Datenbank (MySQL) zugreifen können?

19

Wie erkennt man alle Benutzer, die auf eine Datenbank zugreifen können?

user79483
quelle

Antworten:

14

Stellen Sie als Administrator (in der Regel als root) eine Verbindung zur mysql-Instanz her und geben Sie den folgenden Befehl ein ...

select user from mysql.db where db='DB_NAME';
user79644
quelle
Ich habe dies gerade gegen eine lebende MariaDB (MySQL-Fork) ausgeführt und es wurden 2 leere Zeilen zurückgegeben.
Chris S
1
Wie lautet Ihr Datenbankname? Sie müssen "DB_NAME" durch den Namen Ihrer Datenbank ersetzen.
User79644
Laufen select user from mysql.dbohne Qualifikation gibt ebenfalls 2 leere Zeilen zurück.
Chris S
Nicht sicher, was die Unterschiede zwischen MariaDB und MySQL sind, aber diese Abfrage wird bei einer Standardinstallation von MySQL 5 erwartungsgemäß ausgeführt.
rvf
Dies ist nur ein Teil der Antwort an das OP. Das Feld mysql.user.db kann Platzhalterzeichen enthalten, die mehreren Datenbanken entsprechen. Durch die Verwendung Ihrer vorgeschlagenen Abfrage werden sie übersehen. dev.mysql.com/doc/refman/5.0/en/grant.html
user4514
10

Die Antwort von user79644 ruft die Benutzer mit Berechtigungen auf Datenbankebene ab, vermisst jedoch Benutzer mit Berechtigungen auf Tabellen-, Spalten- oder Prozedurebene. Verwenden Sie die folgenden Anweisungen, um alle zu finden:

SELECT user,host FROM db WHERE db='name';
SELECT user,host FROM tables_priv WHERE db='name';
SELECT user,host FROM columns_priv WHERE db='name';
SELECT user,host FROM procs_priv WHERE db='name';

Zumindest in MySQL 5.5 scheint es so zu sein, als würden Sie mit Berechtigungen auf Spaltenebene über Berechtigungen auf Tabellenebene verfügen. Wenn Sie über Berechtigungen auf Tabellenebene verfügen, bedeutet dies nicht, dass Sie über Berechtigungen auf Datenbankebene verfügen. Nicht sicher über Berechtigungen auf Prozedurebene.

Scott Duckworth
quelle
1
Dies ist nur ein Teil der Antwort. Das Feld mysql.user.db kann Platzhalterzeichen enthalten, die mehreren Datenbanken entsprechen. Durch die Verwendung Ihrer vorgeschlagenen Abfrage werden sie übersehen. dev.mysql.com/doc/refman/5.0/en/grant.html
user4514
Welche Datenbank? Ich bekommeERROR 1046 (3D000): No database selected
user124384
@ user124384 In der Antwort heißt es nicht, dass Sie die mysqlDatenbank verwenden sollten. Dort werden alle von MySQL verwendeten Daten gespeichert. Entweder geben Sie den Befehl USE mysql;von den Datenbanknamen der Tabellennamen hinzufügen, wie FROM mysql.dboderFROM mysql.tables_priv
Gypsy Spruchwirkers
8
# current users that access the db
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+------------------+
| Id  | User | Host      | db   | Command | Time | State | Info             |
+-----+------+-----------+------+---------+------+-------+------------------+
| 214 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+-----+------+-----------+------+---------+------+-------+------------------+

# who can access what at anytime and his privilege level
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+

# what privileges are available
mysql> show privileges;
silviud
quelle
2
show grants zeigt nur die Grants des aktuellen (angemeldeten) Benutzers an
nl-x
als root könnt ihr auch Stipendien für
Rowan Hawkins
2

Beachten Sie, dass MySQLGRANT für Datenbanken Platzhalterzeichen enthalten kann . Dies muss berücksichtigt werden, indem LIKEin der Abfrage verwendet wird:

SELECT user,host FROM db WHERE 'name' LIKE db;
SELECT user,host FROM tables_priv WHERE db='name';
SELECT user,host FROM columns_priv WHERE db='name';
SELECT user,host FROM procs_priv WHERE db='name';
user4514
quelle