Wie kann ich dem Benutzer Superprivilegien gewähren?

44

Ich habe einen Benutzer erstellt und ihm Berechtigungen erteilt1.

`grant all privileges on db1.* to user1@'%' with grant option;

Benutze MySQL Workbench, um Dumps in meine Datenbank zu importieren. Beim Importieren von Dumps in die Datenbank db1 tritt der folgende Fehler auf

ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

In diesen Dumps werden alle Tabellen erfolgreich importiert, aber der Fehler tritt beim Importieren von Routinen in die Datenbank auf. Stimmt etwas mit dem Privileg nicht, das ich dem Benutzer gegeben habe? Bitte um Rat.

lösche meinen Account
quelle

Antworten:

35

In einem politisch korrekten Sinne ist das, wonach Sie gerade gefragt haben, unmöglich. Warum ?

Das SUPER-Privileg ist ein globales Privileg, kein Privileg auf Datenbankebene.

Beim Anlegen des Benutzers mit

grant all privileges on db1.* to user1@'%' with grant option;

Sie haben die Tabelle mysql.usermit user = user1 und host = '%' gefüllt. Alle anderen Spalten (globale Berechtigungen) waren standardmäßig auf "N" gesetzt. Eine dieser Spalten ist Super_priv. Hier ist die Tabelle:

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
| password_expired       | enum('N','Y')                     | NO   |     | N       |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)

mysql>

Super_priverscheint gleich danach Show_db_priv.

Die Berechtigungen auf Datenbankebene wurden in eingetragen mysql.db. Hier ist es:

mysql> desc mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.00 sec)

mysql>

Beachten Sie, dass in Super_privnicht vorhanden ist mysql.db.

Um dies in reinen SQL-Begriffen darzustellen, melden Sie sich als Benutzer1 an und führen Sie Folgendes aus: SHOW GRANTS;Die Ausgabe besteht aus zwei Zeilen:

  • GRANT USAGE ON *.* TO user1@'%' ...
  • GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...

Es gibt einen Hack, den Sie ausprobieren können, aber ich würde ihn normalerweise nicht empfehlen.

SCHRITT 01) Melden Sie sich bei mysql als root @ localhost an (sollte alle Privilegien haben)

SCHRITT 02) Führen Sie diese Abfrage aus

UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';

SCHRITT 03) Führen Sie diese Abfrage aus

FLUSH PRIVILEGES;

Das sollte theoretisch funktionieren. Dann kann Benutzer1 arbeiten (ich mache keine Garantien).

UPDATE 19.12.2014 15:24 EST

Metafaniel hat gerade gefragt

Tolle Erklärung, danke. Wenn Sie diesen Weg nicht empfehlen, um das Problem zu lösen, welcher andere Weg ist dann der beste, um einen Benutzer dieses Super_priv zu granieren? Vielen Dank! - Metafaniel

Da ein Benutzer mit nur DB-Zugriff nicht über SUPER verfügen kann , kann der DEFINER nur manuell im Dump geändert werden. Die Grundidee wäre, die Routinen alleine in eine Textdatei zu kopieren. Bearbeiten Sie dann den Definer zu user1@'%'. Dann sollten Sie in der Lage sein, neu zu laden.

Gleiches gilt für Views

RolandoMySQLDBA
quelle
mit Mariadb und der Update-Anweisung "ERROR 1348 (HY000): Spalte 'Super_priv' ist nicht aktualisierbar '
c4f4t0r
-6

Melden Sie sich mit dem Root-Benutzer an, wählen Sie die Datenbank aus und führen Sie die folgende SQL-Abfrage aus

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'

RamK214
quelle
1
Wie hängt das mit der Frage zusammen? Wolltest du es woanders posten?
Dezso