Como conceder super privilégios ao usuário?


44

Eu criei um usuário e dei privilégios ao usuário1.

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

Estou usando o mysql workbench para importar despejos para o meu banco de dados. Ao importar dumps para o banco de dados db1, ocorre um erro informando que

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

Nesse despejo, todas as tabelas são importadas com êxito, mas o erro ocorre ao importar rotinas para o banco de dados. Existe algo de errado com o privilégio que eu dei ao usuário1. Conselho por favor.

Respostas:


35

Em um sentido politicamente correto, o que você acabou de pedir é impossível. Por quê ?

O privilégio SUPER é um privilégio global, não um privilégio no nível do banco de dados.

Quando você criou o usuário com

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

você preencheu a tabela mysql.usercom user = user1 e host = '%'. Todas as outras colunas (privilégios globais) foram padronizadas como 'N'. Uma dessas colunas é Super_priv. Aqui está a tabela:

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_privaparece logo depois Show_db_priv.

Os privilégios no nível do banco de dados foram preenchidos mysql.db. Aqui está:

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>

Observe que Super_privnão existe em mysql.db.

Para visualizar isso em termos puros de SQL, efetue login como user1 e execute SHOW GRANTS;A saída terá duas linhas:

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

Existe um truque que você pode tentar, mas eu normalmente não recomendaria.

PASSO 01) Entre no mysql como root @ localhost (deve ter todos os privs)

PASSO 02) Execute esta consulta

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

PASSO 03) Execute esta consulta

FLUSH PRIVILEGES;

Teoricamente, isso deve funcionar. Então, o usuário1 pode funcionar (não dou garantias).

UPDATE 2014-12-19 15:24 EST

Metafaniel acabou de perguntar

Ótima explicação, obrigado. No entanto, se você não recomendar essa maneira de resolver o problema, então de que outra maneira é a melhor opção para atribuir a um usuário este Super_priv? Obrigado! - Metafaniel

Como um usuário com apenas acesso ao banco de dados não pode ter SUPER , a única coisa que você pode fazer é alterar o DEFINER manualmente no dump. A idéia básica seria o mysqldump sozinho das rotinas para um arquivo de texto. Em seguida, edite o definidor para user1@'%'. Então, você poderá recarregar.

A mesma coisa para visualizações


usando mariadb e a instrução de atualização "ERRO 1348 (HY000): A coluna 'Super_priv' não é atualizável '
c4f4t0r


-6

Entre com o usuário root e selecione o banco de dados e execute a seguinte consulta sql

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'


1
Como isso está relacionado à questão? Deseja publicá-lo em outro lugar?
Dez17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.