राजनीतिक रूप से सही अर्थों में, आपने जो मांगा है वह असंभव है। क्यों ?
सुपर विशेषाधिकार एक वैश्विक विशेषाधिकार है, नहीं एक डेटाबेस स्तर विशेषाधिकार है।
जब आपने उपयोगकर्ता को बनाया है
grant all privileges on db1.* to user1@'%' with grant option;
आपने mysql.user
उपयोगकर्ता = user1 और होस्ट = '%' के साथ तालिका को आबाद किया । अन्य सभी कॉलम (वैश्विक विशेषाधिकार) 'एन' के लिए डिफ़ॉल्ट थे। उन स्तंभों में से एक है 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_priv
ठीक बाद दिखाई देता है Show_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_priv
में मौजूद नहीं है mysql.db
।
शुद्ध SQL शब्दों में इसे देखने के लिए, user1 के रूप में लॉगिन करें और रन करें SHOW GRANTS;
आउटपुट में दो लाइनें होंगी:
GRANT USAGE ON *.* TO user1@'%' ...
GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...
एक हैक है जिसे आप आजमा सकते हैं लेकिन मैं आमतौर पर इसकी सिफारिश नहीं करूंगा।
STEP 01) mysql को रूट @ localhost के रूप में लॉगिन करें (सभी निजी होना चाहिए)
STEP 02) इस क्वेरी को रन करें
UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND host='%';
STEP 03) इस क्वेरी को रन करें
FLUSH PRIVILEGES;
वह सैद्धांतिक रूप से काम करना चाहिए। फिर, user1 काम कर सकता है (मैं कोई गारंटी नहीं देता)।
अद्यतन 2014-12-19 15:24 ईएसटी
मेटाफैनियल ने बस पूछा
महान व्याख्या, धन्यवाद। हालाँकि अगर आप समस्या को हल करने के लिए उस तरीके को आगे नहीं बढ़ाते हैं, तो इस सुपर-ग्रिप के उपयोगकर्ता के लिए एक और तरीका क्या है? धन्यवाद! - मेटाफैनियल
चूंकि केवल DB पहुंच वाले उपयोगकर्ता के पास SUPER नहीं हो सकता है , केवल एक चीज जो कर सकती है वह है डंप में मैन्युअल रूप से DEFINER को बदलना। मूल विचार एक पाठ फ़ाइल को रूटीन mysqldump करने के लिए होगा। फिर, निश्चित को संपादित करें user1@'%'
। फिर, आपको पुनः लोड करने में सक्षम होना चाहिए।
दृश्यों के लिए एक ही बात है