AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 23265
Accepted
Adam Matan
Adam Matan
Asked: 2012-08-29 02:28:32 +0800 CST2012-08-29 02:28:32 +0800 CST 2012-08-29 02:28:32 +0800 CST

mysql: Mostrar GRANTs para todos os usuários

  • 772

O MySQL SHOW GRANTSmostra as permissões do usuário atual.

Existe uma maneira de fazer login como root e mostrar as permissões de todos os usuários?

mysql permissions
  • 10 10 respostas
  • 323382 Views

10 respostas

  • Voted
  1. rumburak
    2014-04-07T08:59:46+08:002014-04-07T08:59:46+08:00
    select * from information_schema.user_privileges;
    

    EDITAR:

    Como mencionado por Shlomi Noach:

    Ele não lista privilégios específicos de banco de dados, específicos de tabela, específicos de coluna, específicos de rotina. Portanto, a concessão GRANT SELECT ON mydb.* TO myuser@localhost não aparece em information_schema.user_privileges. A solução common_schema apresentada acima agrega os dados de user_privileges e outras tabelas para fornecer uma visão completa.

    • 114
  2. Best Answer
    Shlomi Noach
    2012-08-29T03:11:53+08:002012-08-29T03:11:53+08:00

    Nada embutido. Porém, você tem duas opções:

    • Use common_schemaa visualização sql_show_grants do . Por exemplo, você pode consultar:

      SELECT sql_grants FROM common_schema.sql_show_grants;
      

      Ou você pode consultar usuários específicos, por exemplo:

      SELECT sql_grants FROM common_schema.sql_show_grants WHERE user='app';
      

      Para instalar common_schema, siga as instruções aqui .

      Isenção de responsabilidade: sou o autor desta ferramenta.

    • Use o Percona Toolkit pt-show-grants, por exemplo:

      pt-show-grants --host localhost --user root --ask-pass
      

    Em ambos os casos você pode pedir o GRANTcomando ou o comando REVOKE(oposto).

    O primeiro caso requer que você instale um esquema, o último requer que você instale scripts PERL + dependências.

    • 50
  3. mleu
    2013-09-10T07:44:56+08:002013-09-10T07:44:56+08:00

    Este fragmento de shell do Linux faz um loop sobre todos os usuários do MySQL e faz um SHOW GRANTS para cada um:

    mysql --silent --skip-column-names --execute "select concat('\'',User,'\'@\'',Host,'\'') as User from mysql.user" | sort | \
    while read u
     do echo "-- $u"; mysql --silent --skip-column-names --execute "show grants for $u" | sed 's/$/;/'
    done
    

    Funciona melhor se você puder se conectar ao MySQL sem uma senha.

    A saída é formatada para que possa ser executada em um shell MySQL. Cuidado: A saída também contém as permissões e a senha do usuário root do MySQL! Remova essas linhas se você não quiser que o usuário root do MySQL seja alterado.

    • 18
  4. inemanja
    2016-01-28T13:02:17+08:002016-01-28T13:02:17+08:00

    Um liner (mude -urootpara -u$USER_NAMEuso com outro usuário) em um bash Unix (por causa dos backticks):

    mysql -uroot -p -sNe"`mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;"`"
    

    ou sem backticks e com senha inline (espaço na frente do comando o exclui do histórico do Bash no Ubuntu):

     mysql -uroot -p"$PASSWORD" -sNe"$(mysql -uroot -p"$PASSWORD" -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;")"
    

    No Windows:

    mysql -uroot -p -se"SELECT CONCAT('SHOW GRANTS FOR \'',user,'\'@\'',host,'\';') FROM mysql.user;" > grants.sql
    mysql -uroot -p < grants.sql
    del grants.sql
    
    • 12
  5. Mahesh Patil
    2012-08-29T03:29:02+08:002012-08-29T03:29:02+08:00

    select * from mysql.user;

    Pode fornecer lista de usuários e privilégios atribuídos a cada um deles, mysql.usermas requer acesso à tabela e rooto usuário o possui.

    • 9
  6. Cavallo
    2017-11-15T00:47:45+08:002017-11-15T00:47:45+08:00

    Se você puder executar as seguintes instruções SELECT sem erros:

    /* User-Specific Grants     */   SELECT * FROM mysql.user;
    /* Database-Specific Grants */   SELECT * FROM mysql.db;
    /* Table-Specific Grants    */   SELECT * FROM mysql.tables_priv;
    /* Column-Specific Grants   */   SELECT * FROM mysql.columns_priv;
    

    então sinta-se à vontade para usar o seguinte código (abaixo), escrito em sintaxe .sql.

    Projetei essa consulta em uma tentativa de reconstruir as instruções GRANT para todas as permissões existentes (para manutenção frequente durante a migração do banco de dados). Existem alguns problemas a serem resolvidos, como vinculação de senha de usuário, mas como frequentemente atualizamos as senhas, isso não estava no escopo deste projeto.

    /* Get All Grants/Permissions for MySQL Instance */
    
    /* [Database.Table.Column]-Specific Grants */
    SELECT
        CONCAT("`",gcl.Db,"`") AS 'Database(s) Affected',
        CONCAT("`",gcl.Table_name,"`") AS 'Table(s) Affected',
        gcl.User AS 'User-Account(s) Affected',
        IF(gcl.Host='%','ALL',gcl.Host) AS 'Remote-IP(s) Affected',
        CONCAT("GRANT ",UPPER(gcl.Column_priv)," (",GROUP_CONCAT(gcl.Column_name),") ",
                     "ON `",gcl.Db,"`.`",gcl.Table_name,"` ",
                     "TO '",gcl.User,"'@'",gcl.Host,"';") AS 'GRANT Statement (Reconstructed)'
    FROM mysql.columns_priv gcl
    GROUP BY CONCAT(gcl.Db,gcl.Table_name,gcl.User,gcl.Host)
    /* SELECT * FROM mysql.columns_priv */
    
    UNION
    
    /* [Database.Table]-Specific Grants */
    SELECT
        CONCAT("`",gtb.Db,"`") AS 'Database(s) Affected',
        CONCAT("`",gtb.Table_name,"`") AS 'Table(s) Affected',
        gtb.User AS 'User-Account(s) Affected',
        IF(gtb.Host='%','ALL',gtb.Host) AS 'Remote-IP(s) Affected',
        CONCAT(
            "GRANT ",UPPER(gtb.Table_priv)," ",
            "ON `",gtb.Db,"`.`",gtb.Table_name,"` ",
            "TO '",gtb.User,"'@'",gtb.Host,"';"
        ) AS 'GRANT Statement (Reconstructed)'
    FROM mysql.tables_priv gtb
    WHERE gtb.Table_priv!=''
    /* SELECT * FROM mysql.tables_priv */
    
    UNION
    
    /* Database-Specific Grants */
    SELECT
        CONCAT("`",gdb.Db,"`") AS 'Database(s) Affected',
        "ALL" AS 'Table(s) Affected',
        gdb.User AS 'User-Account(s) Affected',
        IF(gdb.Host='%','ALL',gdb.Host) AS 'Remote-IP(s) Affected',
        CONCAT(
            'GRANT ',
            CONCAT_WS(',',
                IF(gdb.Select_priv='Y','SELECT',NULL),
                IF(gdb.Insert_priv='Y','INSERT',NULL),
                IF(gdb.Update_priv='Y','UPDATE',NULL),
                IF(gdb.Delete_priv='Y','DELETE',NULL),
                IF(gdb.Create_priv='Y','CREATE',NULL),
                IF(gdb.Drop_priv='Y','DROP',NULL),
                IF(gdb.Grant_priv='Y','GRANT',NULL),
                IF(gdb.References_priv='Y','REFERENCES',NULL),
                IF(gdb.Index_priv='Y','INDEX',NULL),
                IF(gdb.Alter_priv='Y','ALTER',NULL),
                IF(gdb.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
                IF(gdb.Lock_tables_priv='Y','LOCK TABLES',NULL),
                IF(gdb.Create_view_priv='Y','CREATE VIEW',NULL),
                IF(gdb.Show_view_priv='Y','SHOW VIEW',NULL),
                IF(gdb.Create_routine_priv='Y','CREATE ROUTINE',NULL),
                IF(gdb.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
                IF(gdb.Execute_priv='Y','EXECUTE',NULL),
                IF(gdb.Event_priv='Y','EVENT',NULL),
                IF(gdb.Trigger_priv='Y','TRIGGER',NULL)
            ),
            " ON `",gdb.Db,"`.* TO '",gdb.User,"'@'",gdb.Host,"';"
        ) AS 'GRANT Statement (Reconstructed)'
    FROM mysql.db gdb
    WHERE gdb.Db != ''
    /* SELECT * FROM mysql.db */
    
    UNION
    
    /* User-Specific Grants */
    SELECT
        "ALL" AS 'Database(s) Affected',
        "ALL" AS 'Table(s) Affected',
        gus.User AS 'User-Account(s) Affected',
        IF(gus.Host='%','ALL',gus.Host) AS 'Remote-IP(s) Affected',
        CONCAT(
            "GRANT ",
            IF((gus.Select_priv='N')&(gus.Insert_priv='N')&(gus.Update_priv='N')&(gus.Delete_priv='N')&(gus.Create_priv='N')&(gus.Drop_priv='N')&(gus.Reload_priv='N')&(gus.Shutdown_priv='N')&(gus.Process_priv='N')&(gus.File_priv='N')&(gus.References_priv='N')&(gus.Index_priv='N')&(gus.Alter_priv='N')&(gus.Show_db_priv='N')&(gus.Super_priv='N')&(gus.Create_tmp_table_priv='N')&(gus.Lock_tables_priv='N')&(gus.Execute_priv='N')&(gus.Repl_slave_priv='N')&(gus.Repl_client_priv='N')&(gus.Create_view_priv='N')&(gus.Show_view_priv='N')&(gus.Create_routine_priv='N')&(gus.Alter_routine_priv='N')&(gus.Create_user_priv='N')&(gus.Event_priv='N')&(gus.Trigger_priv='N')&(gus.Create_tablespace_priv='N')&(gus.Grant_priv='N'),
                "USAGE",
                IF((gus.Select_priv='Y')&(gus.Insert_priv='Y')&(gus.Update_priv='Y')&(gus.Delete_priv='Y')&(gus.Create_priv='Y')&(gus.Drop_priv='Y')&(gus.Reload_priv='Y')&(gus.Shutdown_priv='Y')&(gus.Process_priv='Y')&(gus.File_priv='Y')&(gus.References_priv='Y')&(gus.Index_priv='Y')&(gus.Alter_priv='Y')&(gus.Show_db_priv='Y')&(gus.Super_priv='Y')&(gus.Create_tmp_table_priv='Y')&(gus.Lock_tables_priv='Y')&(gus.Execute_priv='Y')&(gus.Repl_slave_priv='Y')&(gus.Repl_client_priv='Y')&(gus.Create_view_priv='Y')&(gus.Show_view_priv='Y')&(gus.Create_routine_priv='Y')&(gus.Alter_routine_priv='Y')&(gus.Create_user_priv='Y')&(gus.Event_priv='Y')&(gus.Trigger_priv='Y')&(gus.Create_tablespace_priv='Y')&(gus.Grant_priv='Y'),
                    "ALL PRIVILEGES",
                    CONCAT_WS(',',
                        IF(gus.Select_priv='Y','SELECT',NULL),
                        IF(gus.Insert_priv='Y','INSERT',NULL),
                        IF(gus.Update_priv='Y','UPDATE',NULL),
                        IF(gus.Delete_priv='Y','DELETE',NULL),
                        IF(gus.Create_priv='Y','CREATE',NULL),
                        IF(gus.Drop_priv='Y','DROP',NULL),
                        IF(gus.Reload_priv='Y','RELOAD',NULL),
                        IF(gus.Shutdown_priv='Y','SHUTDOWN',NULL),
                        IF(gus.Process_priv='Y','PROCESS',NULL),
                        IF(gus.File_priv='Y','FILE',NULL),
                        IF(gus.References_priv='Y','REFERENCES',NULL),
                        IF(gus.Index_priv='Y','INDEX',NULL),
                        IF(gus.Alter_priv='Y','ALTER',NULL),
                        IF(gus.Show_db_priv='Y','SHOW DATABASES',NULL),
                        IF(gus.Super_priv='Y','SUPER',NULL),
                        IF(gus.Create_tmp_table_priv='Y','CREATE TEMPORARY TABLES',NULL),
                        IF(gus.Lock_tables_priv='Y','LOCK TABLES',NULL),
                        IF(gus.Execute_priv='Y','EXECUTE',NULL),
                        IF(gus.Repl_slave_priv='Y','REPLICATION SLAVE',NULL),
                        IF(gus.Repl_client_priv='Y','REPLICATION CLIENT',NULL),
                        IF(gus.Create_view_priv='Y','CREATE VIEW',NULL),
                        IF(gus.Show_view_priv='Y','SHOW VIEW',NULL),
                        IF(gus.Create_routine_priv='Y','CREATE ROUTINE',NULL),
                        IF(gus.Alter_routine_priv='Y','ALTER ROUTINE',NULL),
                        IF(gus.Create_user_priv='Y','CREATE USER',NULL),
                        IF(gus.Event_priv='Y','EVENT',NULL),
                        IF(gus.Trigger_priv='Y','TRIGGER',NULL),
                        IF(gus.Create_tablespace_priv='Y','CREATE TABLESPACE',NULL)
                    )
                )
            ),
            " ON *.* TO '",gus.User,"'@'",gus.Host,"' REQUIRE ",
            CASE gus.ssl_type
                WHEN 'ANY' THEN
                    "SSL "
                WHEN 'X509' THEN
                    "X509 "
                WHEN 'SPECIFIED' THEN
                    CONCAT_WS("AND ",
                        IF((LENGTH(gus.ssl_cipher)>0),CONCAT("CIPHER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                        IF((LENGTH(gus.x509_issuer)>0),CONCAT("ISSUER '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL),
                        IF((LENGTH(gus.x509_subject)>0),CONCAT("SUBJECT '",CONVERT(gus.ssl_cipher USING utf8),"' "),NULL)
                    )
                ELSE "NONE "
            END,
            "WITH ",
            IF(gus.Grant_priv='Y',"GRANT OPTION ",""),
            "MAX_QUERIES_PER_HOUR ",gus.max_questions," ",
            "MAX_CONNECTIONS_PER_HOUR ",gus.max_connections," ",
            "MAX_UPDATES_PER_HOUR ",gus.max_updates," ",
            "MAX_USER_CONNECTIONS ",gus.max_user_connections,
            ";"
        ) AS 'GRANT Statement (Reconstructed)'
    FROM mysql.user gus
    WHERE gus.Password != ''
    /* SELECT * FROM mysql.user gus */
    
    /* TODO: */
    /* SELECT * FROM mysql.host ghs */
    /* SELECT * FROM mysql.procs_priv gpr */
    

    Feliz em responder/verificar quaisquer dúvidas ou preocupações

    • 9
  7. Mansur Ul Hasan
    2017-03-20T21:54:01+08:002017-03-20T21:54:01+08:00

    Assim você terá uma visão melhor...

    mysql> select Host, Db, User, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv from mysql.db limit 1;
    +------+------+------+-------------+-------------+-------------+-----------------------+------------+
    | Host | Db   | User | Insert_priv | Update_priv | Delete_priv | Create_tmp_table_priv | Alter_priv |
    +------+------+------+-------------+-------------+-------------+-----------------------+------------+
    | %    | test |      | Y           | Y           | Y           | Y                     | Y          |
    +------+------+------+-------------+-------------+-------------+-----------------------+------------+
    1 row in set (0.00 sec)
    
    • 5
  8. billyw
    2018-03-01T14:21:52+08:002018-03-01T14:21:52+08:00

    Conforme mencionado nesta resposta , você pode executar o seguinte conjunto de comandos para listar os privilégios específicos do banco de dados, específicos da tabela, específicos da coluna e específicos da rotina de todos os usuários. Observe que você precisa executar isso no shell, não no prompt de comando do MySQL.

    mysql -u root --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -u root --skip-column-names -A
    

    A vantagem dessa abordagem é que você não precisa instalar software adicional.

    • 2
  9. Eugen Konkov
    2018-05-12T08:33:31+08:002018-05-12T08:33:31+08:00

    O comando SHOW GRANTS [FOR user]pode mostrar qualquer usuário que você quiser. Veja aqui para mais detalhes.

    • 1
  10. CodingInTheUK
    2019-10-06T04:31:05+08:002019-10-06T04:31:05+08:00

    Se você estiver administrando bancos de dados com frequência, provavelmente desejará manter privilégios restritos. Você pode usar um procedimento armazenado para executar uma verificação rapidamente. Este exemplo funciona em mariadb pode precisar de um ajuste para funcionar com a versão padrão do mysql.

    Usando a resposta de Mansur Ali com um pequeno ajuste, reordenando as colunas e adicionando alguns pedidos para organizar melhor a saída.

    Usando um login root:

    USE mysql;
    DELIMITER //
    
    CREATE PROCEDURE ShowPrivs(start, end)
    BEGIN
        SELECT Db, User, Host, Insert_priv, Update_priv, Delete_priv, Create_tmp_table_priv, Alter_priv FROM mysql.db order by Db, Host, User ASC;
    END;
    //
    
    DELIMITER ;
    

    Você pode alterar o procedimento para verificar a tabela mysql.user.

    Uso, usando um login root:

    USE mysql;
    CALL ShowPrivs();
    

    Eu usei o mysql workbench no Ubuntu para executar a parte do procedimento de criação desta resposta.

    Como um aparte e um pouco fora do tópico aqui, você também pode ter um procedimento para mostrar hosts ou usuários desconhecidos. Um exemplo para hosts desconhecidos:

    USE mysql;
    
    DELIMITER //
    CREATE PROCEDURE `ShowUnknownHosts`(IN Hosts_String VARCHAR(200))
    BEGIN
        SELECT user,host FROM user
        WHERE FIND_IN_SET(host, Hosts_String) = 0;
    END//
    
    DELIMITER ;
    

    Nota de uso: Forneça uma string de hosts separados por vírgulas para que apenas um conjunto de '' seja usado:

    CALL ShowUnknownHosts('knownhost1,knownhost2');
    

    Você também pode tornar a variável de coluna incluindo outro parâmetro no procedimento e chamá-lo com ShowUnknownHosts(user,'user1,user2'); por exemplo.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve