Estou me conectando ao MySQL com o usuário 'feedbackdev', mas as consultas são executadas com 'feedback', que é outro usuário no mesmo servidor.
root@board:~# mysql -u feedbackdev -p feedbackdev
Enter password:
mysql> select user();
+-----------------------+
| user() |
+-----------------------+
| feedbackdev@localhost |
+-----------------------+
mysql> select rating, COUNT(*) AS rating_count from order_feedback_view where feedback_created_at >= '2024-10-26 09:01:29' group by rating;
ERROR 1143 (42000): SELECT command denied to user 'feedback'@'localhost' for column 'source_id' in table 'orders'
Aqui estão as SUBVENÇÕES para os usuários
mysql> show grants for 'feedbackdev'@'localhost';
+----------------------------------------------------------------------+
| Grants for feedbackdev@localhost |
+----------------------------------------------------------------------+
| GRANT PROCESS, SUPER ON *.* TO `feedbackdev`@`localhost` |
| GRANT SET_USER_ID ON *.* TO `feedbackdev`@`localhost` |
| GRANT ALL PRIVILEGES ON `feedbackdev`.* TO `feedbackdev`@`localhost` |
+----------------------------------------------------------------------+
3 rows in set (0.00 sec)
mysql> show grants for 'feedback'@'localhost';
+---------------------------------------------------------------------------+
| Grants for feedback@localhost |
+---------------------------------------------------------------------------+
| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO `feedback`@`localhost` |
| GRANT FLUSH_TABLES ON *.* TO `feedback`@`localhost` |
| GRANT ALL PRIVILEGES ON `feedback`.* TO `feedback`@`localhost` |
+---------------------------------------------------------------------------+
3 rows in set (0.00 sec)
MySQL versão 8.0.40
Views no MySQL (assim como em outros RDBMS) podem ser usadas para dar acesso limitado aos dados que de outra forma não estariam disponíveis para o usuário que acessa a view. Para isso, há uma
SQL SECURITY
cláusula na definição , e ela pode ser definida comoDEFINER
e ter definido para algum usuário diferente do(s) usuário(s) pretendido(s) para selecionar da view. Então, a consulta da view deve ser cuidadosamente construída para que nenhuma informação sensível seja fornecida, e então o acesso aos dados que ela retorna é controlado pelas permissões definidas na própria view. (Da mesma forma que funciona com procedimentos e funções armazenados, para o mesmo propósito.)Isso tem uma ressalva quando você exporta sua VIEW via
mysqldump
: ele exporta oDEFINER
valor real armazenado na definição e, ao recarregar, ele o restabelece, mesmo que tenha sido carregado como outro usuário ou no banco de dados que pertence a outro usuário. Foi o que aconteceu no seu caso, e o antigo definidor não tem permissão para os dados pertencentes ao novo usuário, então, quando você tenta invocar a view, seu acesso é negado.Há duas maneiras de contornar esse problema. A primeira é não despejar os definidores com
mysqldump
, usando a--skip-definer
opção . Os definidores serão definidos de volta durante o recarregamento do dump, no entanto, para o usuário que está recarregando-o.A segunda maneira é redefinir a view com
SQL SECURITY INVOKER
, em cujo caso a consulta da view sempre será executada com os privilégios do usuário que está invocando a view em si. Esta seria uma solução mais limpa para este caso, porque parece que esta view logicamente não deveria ser usada para fornecer um acesso limitado a informações protegidas de outra forma, ela não deveria ter sido definida com segurança definidora em primeiro lugar.