Bagaimana cara memberikan hak istimewa super kepada pengguna?

44

Saya telah membuat pengguna dan memberikan hak istimewa kepada pengguna1.

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

Saya menggunakan meja kerja mysql untuk mengimpor dump ke database saya. Saat mengimpor dump ke basis data db1, terjadi kesalahan yang menyatakannya

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

Dalam dump itu semua tabel berhasil diimpor tetapi kesalahan terjadi saat mengimpor rutin ke database. Apakah ada yang salah dengan hak istimewa, saya berikan kepada pengguna1. Tolong saran.

Hapus akun Saya
sumber

Jawaban:

35

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.userdengan 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_privmuncul 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_privtidak 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

RolandoMySQLDBA
sumber
menggunakan mariadb dan pernyataan pembaruan "ERROR 1348 (HY000): Kolom 'Super_priv' tidak dapat diupdate '
c4f4t0r
-6

Login dengan pengguna root dan pilih database dan jalankan query sql berikut

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'

RamK214
sumber
1
Bagaimana ini terkait dengan pertanyaan? Apakah Anda ingin mempostingnya di tempat lain?
dezso