Trong một ý nghĩa chính trị chính xác, những gì bạn vừa yêu cầu là không thể. Tại sao ?
Các đặc quyền SUPER là một đặc ân toàn cầu, không phải là một đặc quyền mức cơ sở dữ liệu.
Khi bạn tạo người dùng với
grant all privileges on db1.* to user1@'%' with grant option;
bạn đã điền vào bảng mysql.user
với user = user1 và host = '%'. Tất cả các cột khác (đặc quyền toàn cầu) được mặc định là 'N'. Một trong những cột đó là Super_priv
. Đây là bảng:
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
xuất hiện ngay sau đó Show_db_priv
.
Các đặc quyền cấp cơ sở dữ liệu đã được đưa vào mysql.db
. Nó đây rồi:
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>
Lưu ý rằng Super_priv
không tồn tại trong mysql.db
.
Để hình dung điều này bằng thuật ngữ SQL thuần túy, đăng nhập với tên user1 và chạy SHOW GRANTS;
Đầu ra sẽ có hai dòng:
GRANT USAGE ON *.* TO user1@'%' ...
GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...
Có một hack bạn có thể thử nhưng tôi thường không khuyến khích.
BƯỚC 01) Đăng nhập vào mysql bằng root @ localhost (nên có tất cả thông tin cá nhân)
BƯỚC 02) Chạy truy vấn này
UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';
BƯỚC 03) Chạy truy vấn này
FLUSH PRIVILEGES;
Đó là lý thuyết nên làm việc. Sau đó, user1 có thể hoạt động (tôi không đảm bảo).
CẬP NHẬT 2014-12-19 15:24 EST
Metafaniel vừa hỏi
Giải thích tuyệt vời, cảm ơn. Tuy nhiên, nếu bạn không đề xuất cách đó để giải quyết vấn đề, vậy thì cách nào khác là cách tốt nhất để tạo thành người dùng Super_priv này ?? Cảm ơn! - Metafaniel
Vì người dùng chỉ có quyền truy cập DB không thể có SUPER , điều duy nhất người ta có thể làm là thay đổi DEFINER theo cách thủ công trong kết xuất. Ý tưởng cơ bản sẽ là mysqldump các thói quen một mình vào một tệp văn bản. Sau đó, chỉnh sửa definer thành user1@'%'
. Sau đó, bạn sẽ có thể tải lại.
Điều tương tự cho lượt xem