Estou tentando usar funções no MySQL 8 e falhando. Eu li a documentação e até onde posso dizer, estou fazendo certo. Como esta é uma tentativa de nível 'hello world', suponho que estou perdendo algo muito óbvio, mas não consigo descobrir. Qualquer ajuda será muito apreciada.
Aqui está o que estou tentando fazer.
CREATE USER 'reader'@'localhost' IDENTIFIED BY 'reader_password';
CREATE ROLE 'read_all';
GRANT SELECT ON MySchema.* TO 'read_all';
GRANT 'read_all' TO 'reader'@'localhost';
O script acima é executado com o usuário root e todas as instruções são bem-sucedidas.
Em seguida, abro uma nova conexão usando as credenciais do usuário 'leitor' e conecto com sucesso. No entanto, qualquer tentativa de SELECT de qualquer tabela em MySchema é negada com a mensagem de erro:
SELECT * FROM MySchema.SomeTable;
SQL Error [1142] [42000]: SELECT command denied to user 'reader'@'localhost' for table 'SomeTable'
Espero que este SELECT seja bem-sucedido, pois a função tem permissões SELECT e o usuário do leitor recebeu a função. o que estou perdendo?
Tenha um ótimo final de semana!
ATUALIZAÇÃO: Após o comentário de Rick James, aqui estão os SHOWs relevantes:
Na conexão raiz (com contexto de esquema ativo 'MySchema'):
SHOW CREATE USER 'reader'@'localhost';
--------------------------------------
CREATE USER 'reader'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*96B291A4F8FC2B6C453E4C54AD2080751B0D4712' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT
SHOW CREATE USER 'read_all';
----------------------------
CREATE USER 'read_all'@'%' IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE ACCOUNT LOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
SHOW GRANTS FOR 'reader'@'localhost';
-------------------------------------
GRANT USAGE ON *.* TO `reader`@`localhost`
GRANT `read_all`@`%` TO `reader`@`localhost`
SHOW GRANTS FOR 'read_all';
----------------------------
GRANT USAGE ON *.* TO `read_all`@`%`
GRANT SELECT ON `MySchema`.* TO `read_all`@`%
E na conexão do leitor:
SHOW GRANTS;
------------
GRANT USAGE ON *.* TO `reader`@`localhost`
GRANT `read_all`@`%` TO `reader`@`localhost`
Então, depois de mergulhar mais fundo na documentação, e especificamente na página " Using Roles ", descobri que: " Por padrão, conceder uma função a uma conta ou nomeá-la no valor da variável de sistema required_roles não faz com que a função se torne ativa automaticamente dentro de sessões de conta... Para especificar quais funções devem se tornar ativas cada vez que um usuário se conectar ao servidor e autenticar, use SET DEFAULT ROLE. "