Tenho uma conta de usuário - vamos chamá-la de 'wordpress' - que preciso permitir o acesso a algumas tabelas de catálogo em outro banco de dados de e-commerce no mesmo servidor. Configurei o usuário com três máscaras de host das quais ele pode se conectar: 'localhost', o endereço IP do servidor web e o nome do host do servidor web. Não há problemas.
O usuário 'wordpress' também tem acesso total ao seu próprio banco de dados, concedido através da seção Schema Privileges no MySQL Workbench. Aqui, ele mostra que o host é '%', que é o que eu quero, pois não quero gerenciar três conjuntos duplicados de privilégios para o mesmo usuário. Se eu olhar em mysql.db, vejo esses privilégios, com '%' na coluna Host.
Então agora eu quero conceder permissão SELECT em um punhado de tabelas em outro banco de dados - vamos chamá-lo de 'loja'. Então eu tento isso:
GRANT SELECT ON store.catalog TO 'wordpress'@'%';
E recebo 'Não é possível encontrar nenhuma linha correspondente na tabela de usuários', pelo motivo óbvio de que '%' não é uma máscara de host da qual permiti explicitamente uma conexão para esse usuário específico. Então, qual é a sintaxe adequada para conceder um privilégio de tabela a um usuário de qualquer uma de suas máscaras de host permitidas? Como o MySQL Workbench está se saindo bem para privilégios de esquema? Eu não tenho que inserir linhas manualmente em mysql.tables_priv, tenho?
UPDATE : Para esclarecer, aqui está a aparência das tabelas de usuário/concessão atuais. Eu anonimizei alguns nomes, obviamente. Observe que o host na tabela de privilégios do esquema é '%', mas não há usuários com esse host. Como faço para que o MySQL me permita fazer isso com concessões de objetos de esquema? De preferência sem mexer diretamente no mysql.tables_priv, mas farei isso se for necessário.
mysql> SELECT user, host FROM mysql.user WHERE user = 'wordpress';
+-----------+-----------+
| user | host |
+-----------+-----------+
| wordpress | 10.0.0.22 |
| wordpress | webserver |
| wordpress | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)
mysql> SELECT user, host, db, select_priv FROM mysql.db WHERE User = 'wordpress';
+-----------+------+----------------+-------------+
| user | host | db | select_priv |
+-----------+------+----------------+-------------+
| wordpress | % | wordpress | Y |
| wordpress | % | wordpress_test | Y |
+-----------+------+----------------+-------------+
2 rows in set (0.00 sec)
mysql> SHOW GRANTS FOR 'wordpress'@'localhost';
+---------------------------------------------------------------------------+
| Grants for wordpress@localhost |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '--' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW GRANTS FOR 'wordpress'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'wordpress' on host '%'
O MySQL Workbench está fazendo algo terrivelmente não documentado com privilégios de esquema/objeto? Apenas por diversão, concedi alguns privilégios de tabela para uma das combinações específicas de usuário@host, então atualizei mysql.tables_priv para alterar o host para '%'. Depois de executar FLUSH PRIVILEGES, funcionou perfeitamente. Esquisito.
Quando você executa
GRANT SELECT ON store.catalog TO 'wordpress'@'%';
, o mysqld deseja inserir uma linha na tabela de permissõesmysql.tables_priv
. Aqui está mysql.tables_priv:Como você deseja inserir uma linha em
mysql.table_priv
onde user='wordpress' e host='%', deve existir uma linha emmysql.user
onde user='wordpress' e host='%'.Você também mencionou que está usando o MySQL Workbench. Você deve estar usando
'root'@'localhost'
. Isso normalmente teria todos os direitos e uma senha.Se você quiser apenas permitir SELECT anônimo nessa tabela, primeiro execute isto:
Isso vai colocar
wordpress@'%'
emmysql.user
. Depois,GRANT SELECT ON store.catalog TO 'wordpress'@'%'
deve rodar bem.Você terá que ver quais outras entradas do wordpress estão em
mysql.user
. Isso deve mostrar quais comandos SQL GRANT você precisa:Isso funcionou para mim usando a linha de comando (não o workbench):
Eu vasculhei e encontrei este relatório de bug . Qual a versão do seu Workbench? Parece que eles têm uma correção, mas não sendo usuário do Workbench, não sei o versionamento deles (a versão atual deve ser corrigida).
Mesmo que não seja, a solução é executá-lo através da linha de comando!