Как предоставить супер привилегию пользователю?

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.useruser = 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;

Это теоретически должно работать. Тогда user1 может работать (я не даю никаких гарантий).

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

Метафаниель только что спросил

Отличное объяснение, спасибо. Однако, если вы не рекомендуете этот способ решения проблемы, то какой другой способ является лучшим для предоставления пользователю этого Super_priv ?? Благодарность! - метафаниэль

Поскольку пользователь, имеющий только доступ к БД, не может иметь SUPER , единственное, что он может сделать, это изменить DEFINER вручную в дампе. Основная идея состоит в том, чтобы mysqldump подпрограммы самостоятельно в текстовый файл. Затем отредактируйте определитель на user1@'%'. Затем вы сможете перезагрузить.

То же самое для представлений

RolandoMySQLDBA
источник
с использованием mariadb и оператора обновления «ОШИБКА 1348 (HY000): столбец« Super_priv »не обновляется»
c4f4t0r
-6

Войдите в систему как пользователь root, выберите базу данных и выполните следующий SQL-запрос.

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'

RamK214
источник
1
Как это связано с вопросом? Вы хотели опубликовать это где-то еще?
Дезсо