Як надати користувачеві супер привілей?


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користувачем = 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_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@'%' ...

Ви можете спробувати зламати, але я зазвичай не рекомендував би його.

КРОК 01) Увійдіть до mysql як root @ localhost (повинні бути всі приватні дані)

КРОК 02) Запустіть цей запит

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

КРОК 03) Запустіть цей запит

FLUSH PRIVILEGES;

Це теоретично повинно працювати. Тоді, користувач1 може працювати (я не даю жодних гарантій).

ОНОВЛЕННЯ 2014-12-19 15:24 EST

Метафаніел щойно запитав

Чудове пояснення, дякую. Однак якщо ви не рекомендуєте таким чином вирішити проблему, то який інший спосіб найкращий, щоб дозволити користувачеві цей Super_priv ?? Дякую! - Метафаніел

Оскільки користувач, що має лише доступ до БД, не може мати SUPER , єдине, що можна зробити, - це змінити DEFINER вручну на дамп. Основна ідея полягала б у тому, щоб mysqld підписати підпрограми поодинці до текстового файлу. Потім відредагуйте значення для user1@'%'. Потім ви повинні мати можливість перезавантажити.

Те саме для переглядів


за допомогою mariadb та повідомлення про оновлення "ПОМИЛКА 1348 (HY000): стовпець" Super_priv "не
оновлюється


-6

Увійдіть із користувачем root та виберіть базу даних та запустіть наступний запит sql

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'


1
Як це пов’язано з питанням? Ви хотіли розмістити його десь ще?
дезсо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.