Estou no MySQL 8.0.28 e tenho esta função:
DELIMITER $$
CREATE FUNCTION DelayedHello()
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DO SLEEP(3);
RETURN CONCAT('Hello ', 'World!');
END$$
DELIMITER ;
E isso foi criado pelo usuário root.
Mas quando um usuário chamado test
executa essa função, no show processlist
, é isso que vejo. Então, parece que o usuário root
está executando.
127.0.0.1> select * from information_schema.processlist ;
+-------+-----------------+------------------+-----------+---------+---------+------------------------+----------------------------------------------+
| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
+-------+-----------------+------------------+-----------+---------+---------+------------------------+----------------------------------------------+
| 48547 | root | %:40814 | helpscout | Query | 1 | User sleep | DO SLEEP(3) |
Tentei consultar information_schema.processlist
para ver o usuário, mas ele retornou a mesma informação de que o usuário root parece estar executando isso. Então, existe uma maneira de mostrar na lista de processos que é quem test
está executando isso? Caso contrário, como descubro quem realmente chamou essa função?
Esta é uma combinação do comportamento padrão,
DEFINER
doINVOKER
e do comportamento padrão em torno desses dois conceitos quando a função é criada ou alterada.Quando você cria uma função, ela captura o
CURRENT_USER()
como a,DEFINER
a menos que você declare explicitamente um. No seu exemplo, o padrão é oroot
usuário.Quando sua função é chamada, uma verificação de segurança é executada para fornecer contexto para execução. Como sua função tinha um
DEFINER
ofroot
, consultar ambosSHOW PROCESSLIST
eSELECT * FROM information_schema.processlist
retornaria o usuário chamador comoroot
setest
estivesse chamando.Se você alterar a função para o que tenho abaixo, ela deverá capturar o
CURRENT_USER()
(por exemploroot
, ou o criador) comoDEFINER
devido àDEFINER=CURRENT_USER()
sintaxe.Quando a função abaixo é chamada, a consulta
SHOW PROCESSLIST
orSELECT * FROM information_schema.processlist;
mostraria a função como sendo executada peloINVOKER
- neste casotest
porque aSQL SECURITY INVOKER
sintaxe é especificada.Tenha em mente que:
SQL SECURITY DEFINER
significa que a função será executada e relatada comoDEFINER
e com as permissões disponíveis para o arquivoDEFINER
.SQL SECURITY INVOKER
significa que sua função será executada com as permissões deINVOKER
e relatada como aoINVOKER
examinar processos.Editar: limpei alguns códigos de exemplo e explicações.