Infelizmente, se um usuário já tiver privilégios no nível de banco de dados, executar revoke all on db.table from user@host; não criará todos os privilégios existentes no nível de tabela (exceto o que você está revogando) para você.
A melhor maneira que eu posso pensar em fazer isso é adicionar todos os privilégios de nível de tabela que você precisa para o usuário e, em seguida, revogar o privilégio de nível de banco de dados.
O MySQL mantém seus privilégios em diferentes tabelas no banco de dados mysql , dependendo do contexto para o qual o privilégio serve.
- Se você conceder um privilégio em
*.* , isso será na tabela mysql.User .
- Se você conceder um privilégio em
db.* , isso será na tabela mysql.db .
- Se você conceder um privilégio em
db.table , isso será na tabela mysql.tables_priv .
- Se você conceder privilégios de coluna em
db.table , a tabela mysql.columns_priv será usada.
Portanto, executar a revogação final abaixo apenas remove as entradas da tabela db e deixa tudo o que já estava na tabela tables_priv .
Exemplo: o usuário já tem isto:
mysql> grant all on db.* to user@host;
Você executa isso:
mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;
O usuário poderá acessar db.table5 até executar o comando revogar. O usuário terá acesso às outras quatro tabelas antes e depois da revogação.
A exceção a isso (sempre há uma exceção) é com privilégios de coluna. Se você conceder privilégios de coluna a um usuário que já tenha privilégios de nível de tabela na mesma tabela, eles existirão na tabela columns_priv , mas não serão exibidos em um comando show grants e desaparecerão se você executar um revoke ... on db.table from user@host; comando.
Você deve poder criar scripts para adicionar todos os privilégios de nível de tabela, em vez de criá-los manualmente.