Làm thế nào để cấp siêu đặc quyền cho người dùng?


44

Tôi đã tạo một người dùng và trao đặc quyền cho user1.

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

Đang sử dụng bàn làm việc mysql để nhập các bãi chứa vào cơ sở dữ liệu của tôi. Trong khi nhập kết xuất vào cơ sở dữ liệu db1, lỗi xảy ra cho biết

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

Trong đó, tất cả các bảng được nhập thành công nhưng lỗi xảy ra trong khi nhập các thường trình vào cơ sở dữ liệu. Có bất cứ điều gì sai với đặc quyền, tôi đã trao cho người dùng1. Vui lòng cho lời khuyên.

Câu trả lời:


35

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.uservớ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_privxuấ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_privkhô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


sử dụng mariadb và tuyên bố cập nhật "ERROR 1348 (HY000): Cột 'Super_priv' không thể cập nhật '
c4f4t0r


-6

Đăng nhập với người dùng root và chọn cơ sở dữ liệu và chạy truy vấn sql sau

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITNING'


1
Làm thế nào điều này có liên quan đến câu hỏi? Bạn có muốn đăng nó ở một nơi khác?
dezso
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.