Come concedere il super privilegio all'utente?


44

Ho creato un utente e ho dato i privilegi all'utente1.

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

Sto usando mysql workbench per importare dump nel mio database. Durante l'importazione dei dump nel database db1, si verifica un errore che lo indica

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

In tali dump tutte le tabelle vengono importate correttamente ma l'errore si verifica durante l'importazione di routine nel database. C'è qualcosa di sbagliato nel privilegio, che ho dato all'utente1. Per favore, consiglio.

Risposte:


35

In senso politicamente corretto, ciò che hai appena chiesto è impossibile. Perché ?

Il privilegio SUPER è un privilegio globale, non un privilegio a livello di database.

Quando hai creato l'utente con

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

hai popolato la tabella mysql.usercon user = user1 e host = '%'. Tutte le altre colonne (privilegi globali) erano impostate su "N". Una di quelle colonne è Super_priv. Ecco la tabella:

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_privappare subito dopo Show_db_priv.

I privilegi a livello di database sono stati popolati in mysql.db. Eccolo:

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>

Si noti che Super_privnon esiste in mysql.db.

Per visualizzarlo in termini SQL puri, accedi come user1 ed esegui SHOW GRANTS;L'output avrà due righe:

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

C'è un trucco che puoi provare ma normalmente non lo consiglierei.

PASSAGGIO 01) Accedi a mysql come root @ localhost (dovrebbe avere tutti i priv)

PASSAGGIO 02) Eseguire questa query

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

PASSAGGIO 03) Eseguire questa query

FLUSH PRIVILEGES;

Che teoricamente dovrebbe funzionare. Quindi, user1 potrebbe funzionare (non fornisco garanzie).

AGGIORNAMENTO 2014-12-19 15:24 EST

Metafaniel ha appena chiesto

Ottima spiegazione, grazie. Tuttavia, se non consiglierei in questo modo di risolvere il problema, quale altro modo è il migliore per fare un super utente a questo Super_priv ?? Grazie! - Metafaniel

Poiché un utente con solo l'accesso al DB non può avere SUPER , l'unica cosa che si può fare è cambiare DEFINER manualmente nel dump. L'idea di base sarebbe quella di mettere da solo le routine su un file di testo. Quindi, modifica il definitore in user1@'%'. Quindi, dovresti essere in grado di ricaricare.

Stessa cosa per Views


utilizzando mariadb e la dichiarazione di aggiornamento "ERRORE 1348 (HY000): la colonna" Super_priv "non è aggiornabile"
c4f4t0r


-6

Accedere con l'utente root e selezionare il database ed eseguire la seguente query sql

SET @ @ global.sql_mode = 'NO_ENGINE_SUBSTITUTION'


1
In che modo ciò è legato alla domanda? Volevi pubblicarlo da qualche altra parte?
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.