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.