В политкорректном смысле то, о чем вы только что просили, невозможно. Зачем ?
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_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@'%'
. Затем вы сможете перезагрузить.
То же самое для представлений
У меня была точно такая же проблема. То, что я сделал, было:
И проблема решена.
ПРЕДУПРЕЖДЕНИЕ. Есть ли какая-либо опасность в предоставлении привилегий SUPER пользователю?
источник
Войдите в систему как пользователь root, выберите базу данных и выполните следующий SQL-запрос.
SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'
источник