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.user
mit 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_priv
erscheint 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_priv
nicht 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
Ich hatte genau das gleiche Problem. Was ich getan habe war:
Und das Problem gelöst.
CAVEAT: Besteht die Gefahr, einem Benutzer SUPER-Berechtigungen zu erteilen ?
quelle
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'
quelle