Dalam arti yang benar secara politis, apa yang Anda minta tidak mungkin. Mengapa
Hak istimewa SUPER adalah hak istimewa global, bukan hak istimewa tingkat basis data.
Saat Anda membuat pengguna dengan
grant all privileges on db1.* to user1@'%' with grant option;
Anda mengisi tabel mysql.user
dengan user = user1 dan host = '%'. Semua kolom lainnya (hak istimewa global) default ke 'N'. Salah satu kolom itu adalah Super_priv
. Ini tabelnya:
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
muncul tepat setelah Show_db_priv
.
Hak istimewa tingkat basis data dimasukkan ke dalamnya mysql.db
. Ini dia:
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>
Perhatikan bahwa Super_priv
tidak ada di mysql.db
.
Untuk memvisualisasikan ini dalam istilah SQL murni, login sebagai user1 dan jalankan SHOW GRANTS;
Output akan memiliki dua baris:
GRANT USAGE ON *.* TO user1@'%' ...
GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...
Ada peretasan yang bisa Anda coba tetapi saya biasanya tidak akan merekomendasikannya.
LANGKAH 01) Login ke mysql sebagai root @ localhost (harus memiliki semua privs)
LANGKAH 02) Jalankan permintaan ini
UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';
LANGKAH 03) Jalankan permintaan ini
FLUSH PRIVILEGES;
Secara teori itu seharusnya bekerja. Kemudian, user1 dapat bekerja (saya tidak membuat jaminan).
UPDATE 2014-12-19 15:24 EST
Metafaniel baru saja bertanya
Penjelasan yang bagus, terima kasih. Namun jika Anda tidak merekomendasikan cara itu untuk menyelesaikan masalah, lalu apa cara lain yang terbaik untuk mengubah pengguna Super_priv ini ?? Terima kasih! - Metafaniel
Karena pengguna dengan hanya akses DB tidak dapat memiliki SUPER , satu-satunya yang dapat dilakukan adalah mengubah DEFINER secara manual di dump. Ide dasarnya adalah untuk mysqldump rutinitas sendirian ke file teks. Kemudian, edit definer ke user1@'%'
. Kemudian, Anda harus dapat memuat ulang.
Hal yang Sama untuk Dilihat
Saya memiliki masalah yang sama persis. Apa yang saya lakukan adalah:
Dan masalah terpecahkan.
CAVEAT: Apakah ada bahaya dalam memberikan hak istimewa SUPER kepada pengguna?
sumber
Login dengan pengguna root dan pilih database dan jalankan query sql berikut
SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'
sumber