O privilégio é SHOW VIEW, não SHOW_VIEW, mas você não precisa concedê-lo a um usuário, a menos que você queira que ele SHOW CREATE VIEWnas visualizações ... ele pode selecionar a partir das visualizações apenas com o SELECTprivilégio. O que você quer dizer com "agrupar todas as operações de leitura na concessão"?
Michael - sqlbot
Se houver qualquer privilégio único que represente TODAS as operações READ no banco de dados. Eu entendo que eles estão fornecendo acesso refinado, mas uma abstração de alto nível conveniente teria nos ajudado.
Ajeet Ganga
Respostas:
161
Se houver qualquer privilégio único que represente TODAS as operações READ no banco de dados.
Depende de como você define "tudo lido".
"Ler" tabelas e visualizações é o SELECTprivilégio. Se é isso que você quer dizer com "tudo lido", então sim:
No entanto, parece que você se refere à capacidade de "ver" tudo, de "olhar, mas não tocar". Então, aqui estão os outros tipos de leitura que vêm à mente:
"Ler" a definição das visualizações é o SHOW VIEWprivilégio.
"Ler" a lista de consultas atualmente em execução por outros usuários é o PROCESSprivilégio.
"Ler" o estado de replicação atual é o REPLICATION CLIENTprivilégio.
Observe que qualquer um ou todos eles podem expor mais informações do que você pretende expor, dependendo da natureza do usuário em questão.
Se essa é a leitura que você deseja fazer, você pode combinar qualquer um desses (ou qualquer outro dos privilégios disponíveis ) em uma única GRANTinstrução.
GRANTSELECT, SHOW VIEW, PROCESS,REPLICATION CLIENT ON*.*TO...
No entanto, não há um único privilégio que conceda algum subconjunto de outros privilégios, que é o que parece que você está pedindo.
Se você estiver fazendo as coisas manualmente e procurando uma maneira mais fácil de fazer isso sem precisar se lembrar da concessão exata que você normalmente faz para uma determinada classe de usuário, você pode procurar a instrução para regenerar as concessões de um usuário comparável e alterá-la. para criar um novo usuário com privilégios semelhantes:
mysql> SHOW GRANTS FOR'not_leet'@'localhost';+------------------------------------------------------------------------------------------------------------------------------------+| Grants for not_leet@localhost |+------------------------------------------------------------------------------------------------------------------------------------+|GRANTSELECT,REPLICATION CLIENT ON*.*TO'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'|+------------------------------------------------------------------------------------------------------------------------------------+1rowinset(0.00 sec)
Alterar 'not_leet' e 'localhost' para corresponder ao novo usuário que você deseja adicionar, junto com a senha, resultará em uma GRANTinstrução reutilizável para criar um novo usuário.
Ou, se você deseja uma única operação para configurar e conceder o conjunto limitado de privilégios aos usuários, e talvez remover quaisquer privilégios não merecidos, isso pode ser feito criando um procedimento armazenado que encapsula tudo o que você deseja fazer. Dentro do corpo do procedimento, você construiria a GRANTinstrução com SQL dinâmico e / ou manipularia diretamente as próprias tabelas de permissões.
Em esta recente pergunta sobre administradores de banco de dados , o cartaz queria a capacidade de um usuário sem privilégios para modificar outros usuários, o que obviamente não é algo que pode ser feito normalmente - um usuário que pode modificar outros usuários é, praticamente por definição, não um usuário sem privilégios - no entanto - procedimentos armazenados forneceram uma boa solução nesse caso, porque eles são executados com o contexto de segurança de seu DEFINERusuário, permitindo que qualquer pessoa com EXECUTEprivilégios no procedimento assuma temporariamente privilégios escalados para permitir que eles façam coisas específicas que procedimento realiza.
Obrigado. Além da ótima resposta, também gostei da sua senha. :)
Ajeet Ganga
2
Vale a pena notar: PROCESS e REPLICATION CLIENT são tipos de privilégio "globais", portanto, a sintaxe falhará quando definida com uma exclusão "por banco de dados". GRANT PROCESS ON mydb. * Seria inválido, mas GRANT PROCESS ON *. * Seria OK.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' WITH GRANT OPTION;
Várias permissões que você pode conceder a um usuário são
ALL PRIVILEGES- This would allow a MySQL userall access to a designated database(orif no databaseis selected, across the system)
CREATE- allows them tocreate new tables or databases
DROP- allows them to them todelete tables or databases
DELETE- allows them todeleterowsfrom tables
INSERT- allows them toinsertrowsinto tables
SELECT- allows them touse the Select command toread through databases
UPDATE- allow them toupdatetablerowsGRANT OPTION- allows them tograntor remove other users' privileges
Para fornecer permissão a um usuário específico, você pode usar esta estrutura:
GRANT[type of permission]ON[database name].[table name]TO‘[username]’@'localhost’;
Este comando fornece ao usuário acesso somente leitura ao banco de dados a partir do host local apenas. Se você souber o nome do host ou endereço IP do host em que o coletor será instalado, digite o seguinte comando:
grantselecton database_name.*to'read-only_user_name'@'host_name or IP_address' identified by'password';
O nome do host deve ser resolvido pelo DNS ou pelo arquivo de hosts local. No prompt do mysql, digite o seguinte comando:
flush privileges;
Digite quit.
A seguir está uma lista de comandos de exemplo e mensagens de confirmação:
Até mesmo o usuário obteve a resposta e @Michael - sqlbot cobriu a maioria dos pontos muito bem em seu post, mas um ponto está faltando, então apenas tentando cobri-lo.
Se você deseja fornecer permissão de leitura a um usuário simples (tipo não de administrador) -
Nota: EXECUTE é necessário aqui, para que o usuário possa ler os dados se houver um procedimento armazenado que produza um relatório (tem poucas instruções de seleção).
Substitua localhost pelo IP específico a partir do qual o usuário se conectará ao banco de dados.
Permissões de leitura adicionais são-
SHOW VIEW: Se você deseja mostrar o esquema de visualização.
CLIENTE DE REPLICAÇÃO: Se o usuário precisar verificar o status de replicação / escravo. Mas precisa dar permissão em todos os DB.
PROCESSO: Se o usuário precisar verificar o processo em execução. Funcionará apenas com todos os DB.
Esta é a única solução que funcionou para mim. Parece que as outras soluções estão desatualizadas, como você disse. Obrigado por fornecer esta solução atualizada.
Kyle Bridenstine
0
Se você deseja que a visualização seja lida apenas após conceder a permissão de leitura, você pode usar ALGORITHM = TEMPTABLE em sua definição de visualização DDL.
SHOW VIEW
, nãoSHOW_VIEW
, mas você não precisa concedê-lo a um usuário, a menos que você queira que eleSHOW CREATE VIEW
nas visualizações ... ele pode selecionar a partir das visualizações apenas com oSELECT
privilégio. O que você quer dizer com "agrupar todas as operações de leitura na concessão"?Respostas:
Depende de como você define "tudo lido".
"Ler" tabelas e visualizações é o
SELECT
privilégio. Se é isso que você quer dizer com "tudo lido", então sim:No entanto, parece que você se refere à capacidade de "ver" tudo, de "olhar, mas não tocar". Então, aqui estão os outros tipos de leitura que vêm à mente:
"Ler" a definição das visualizações é o
SHOW VIEW
privilégio."Ler" a lista de consultas atualmente em execução por outros usuários é o
PROCESS
privilégio."Ler" o estado de replicação atual é o
REPLICATION CLIENT
privilégio.Observe que qualquer um ou todos eles podem expor mais informações do que você pretende expor, dependendo da natureza do usuário em questão.
Se essa é a leitura que você deseja fazer, você pode combinar qualquer um desses (ou qualquer outro dos privilégios disponíveis ) em uma única
GRANT
instrução.No entanto, não há um único privilégio que conceda algum subconjunto de outros privilégios, que é o que parece que você está pedindo.
Se você estiver fazendo as coisas manualmente e procurando uma maneira mais fácil de fazer isso sem precisar se lembrar da concessão exata que você normalmente faz para uma determinada classe de usuário, você pode procurar a instrução para regenerar as concessões de um usuário comparável e alterá-la. para criar um novo usuário com privilégios semelhantes:
Alterar 'not_leet' e 'localhost' para corresponder ao novo usuário que você deseja adicionar, junto com a senha, resultará em uma
GRANT
instrução reutilizável para criar um novo usuário.Ou, se você deseja uma única operação para configurar e conceder o conjunto limitado de privilégios aos usuários, e talvez remover quaisquer privilégios não merecidos, isso pode ser feito criando um procedimento armazenado que encapsula tudo o que você deseja fazer. Dentro do corpo do procedimento, você construiria a
GRANT
instrução com SQL dinâmico e / ou manipularia diretamente as próprias tabelas de permissões.Em esta recente pergunta sobre administradores de banco de dados , o cartaz queria a capacidade de um usuário sem privilégios para modificar outros usuários, o que obviamente não é algo que pode ser feito normalmente - um usuário que pode modificar outros usuários é, praticamente por definição, não um usuário sem privilégios - no entanto - procedimentos armazenados forneceram uma boa solução nesse caso, porque eles são executados com o contexto de segurança de seu
DEFINER
usuário, permitindo que qualquer pessoa comEXECUTE
privilégios no procedimento assuma temporariamente privilégios escalados para permitir que eles façam coisas específicas que procedimento realiza.fonte
Isso criará um usuário com
SELECT
privilégios para todos os bancos de dados, incluindo visualizações.fonte
Várias permissões que você pode conceder a um usuário são
Para fornecer permissão a um usuário específico, você pode usar esta estrutura:
Eu achei este artigo muito útil
fonte
Um guia passo a passo que encontrei aqui .
Para criar uma conta de usuário de banco de dados somente leitura para MySQL
Em um prompt do UNIX, execute o programa de linha de comando MySQL e faça login como administrador digitando o seguinte comando:
Digite a senha da conta root. No prompt do mysql, execute uma das seguintes etapas:
Para fornecer ao usuário acesso ao banco de dados de qualquer host, digite o seguinte comando:
Se o coletor for instalado no mesmo host que o banco de dados, digite o seguinte comando:
Este comando fornece ao usuário acesso somente leitura ao banco de dados a partir do host local apenas. Se você souber o nome do host ou endereço IP do host em que o coletor será instalado, digite o seguinte comando:
O nome do host deve ser resolvido pelo DNS ou pelo arquivo de hosts local. No prompt do mysql, digite o seguinte comando:
Digite
quit
.A seguir está uma lista de comandos de exemplo e mensagens de confirmação:
fonte
Até mesmo o usuário obteve a resposta e @Michael - sqlbot cobriu a maioria dos pontos muito bem em seu post, mas um ponto está faltando, então apenas tentando cobri-lo.
Se você deseja fornecer permissão de leitura a um usuário simples (tipo não de administrador) -
Nota: EXECUTE é necessário aqui, para que o usuário possa ler os dados se houver um procedimento armazenado que produza um relatório (tem poucas instruções de seleção).
Substitua localhost pelo IP específico a partir do qual o usuário se conectará ao banco de dados.
Permissões de leitura adicionais são-
fonte
Nota para MySQL 8 é diferente
Você precisa fazer isso em duas etapas:
fonte
Se você deseja que a visualização seja lida apenas após conceder a permissão de leitura, você pode usar ALGORITHM = TEMPTABLE em sua definição de visualização DDL.
fonte