วิธีการให้สิทธิ์พิเศษแก่ผู้ใช้?


44

ฉันสร้างผู้ใช้และให้สิทธิ์แก่ผู้ใช้ 1

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

ฉันกำลังใช้ mysql workbench เพื่อนำเข้าฐานข้อมูลของฉัน ขณะที่อิมพอร์ตดัมพ์ไปยังฐานข้อมูล db1 ข้อผิดพลาดเกิดขึ้นโดยระบุว่า

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

ในที่ทิ้งตารางทั้งหมดจะถูกนำเข้าเรียบร้อยแล้ว แต่เกิดข้อผิดพลาดในขณะที่นำเข้ารูทีนไปยังฐานข้อมูล มีอะไรผิดปกติกับสิทธิพิเศษที่ฉันมอบให้กับผู้ใช้ 1 หรือไม่ โปรดให้คำแนะนำ.

คำตอบ:


35

ในแง่ที่ถูกต้องทางการเมืองสิ่งที่คุณเพิ่งถามไปไม่ได้ ทำไม

SUPER สิทธิ์เป็นสิทธิ์ทั่วโลกไม่ได้เป็นสิทธิพิเศษระดับฐานข้อมูล

เมื่อคุณสร้างผู้ใช้งานด้วย

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

คุณเติมข้อมูลตารางmysql.userด้วย user = user1 และ host = '%' คอลัมน์อื่น ๆ ทั้งหมด (สิทธิพิเศษระดับโลก) ได้รับการตั้งค่าเริ่มต้นเป็น 'N' Super_privคอลัมน์ใดคอลัมน์หนึ่งในนั้นคือ นี่คือตาราง:

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_privShow_db_privปรากฏขึ้นหลังจากที่เหมาะสม

mysql.dbสิทธิพิเศษระดับฐานข้อมูลประชากรได้เข้า นี่ไง:

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>

ขอให้สังเกตว่าไม่อยู่ในSuper_privmysql.db

ในการมองเห็นสิ่งนี้ในเงื่อนไขบริสุทธิ์ของแท้เข้าสู่ระบบในฐานะผู้ใช้ 1 และเรียกใช้SHOW GRANTS;เอาต์พุตจะมีสองบรรทัด:

  • GRANT USAGE ON *.* TO user1@'%' ...
  • GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...

มีแฮ็คที่คุณสามารถลองได้ แต่ปกติฉันจะไม่แนะนำ

ขั้นตอนที่ 01) เข้าสู่ระบบ mysql ในฐานะ root @ localhost (ควรมี privs ทั้งหมด)

ขั้นตอนที่ 02) เรียกใช้แบบสอบถามนี้

UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';

ขั้นตอนที่ 03) เรียกใช้แบบสอบถามนี้

FLUSH PRIVILEGES;

ในทางทฤษฎีควรทำงาน จากนั้น user1 อาจใช้งานได้ (ฉันไม่รับประกัน)

อัปเดต 2014-12-19 15:24 EST

เมตาฟาเนียลเพิ่งถาม

คำอธิบายที่ดีขอบคุณ อย่างไรก็ตามถ้าคุณไม่แนะนำวิธีการแก้ปัญหาแล้ววิธีอื่นเป็นวิธีที่ดีที่สุดในการแก่นผู้ใช้ Super_priv นี้หรือไม่? ขอบคุณ! - Metafaniel

เนื่องจากผู้ใช้ที่มีการเข้าถึงฐานข้อมูลเท่านั้นจึงไม่สามารถมีSUPERสิ่งเดียวที่ทำได้คือเปลี่ยน DEFINER ด้วยตนเองในการถ่ายโอนข้อมูล แนวคิดพื้นฐานคือการ mysqldump กิจวัตรคนเดียวกับไฟล์ข้อความ จากนั้นแก้ไข definer user1@'%'ไป จากนั้นคุณควรโหลดซ้ำได้

สิ่งเดียวกันสำหรับมุมมอง


ใช้ mariadb และคำสั่งการปรับปรุง "ข้อผิดพลาด 1348 (HY000): คอลัมน์ 'Super_priv' ไม่สามารถอัปเดตได้ '
c4f4t0r


-6

ล็อกอินด้วยผู้ใช้รูทและเลือกฐานข้อมูลและรันเคียวรี sql ต่อไปนี้

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'


1
สิ่งนี้เกี่ยวข้องกับคำถามอย่างไร คุณต้องการโพสต์ไว้ที่อื่นหรือไม่?
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.