我在 MySQL 8.0.28 上,我有这个功能:
DELIMITER $$
CREATE FUNCTION DelayedHello()
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DO SLEEP(3);
RETURN CONCAT('Hello ', 'World!');
END$$
DELIMITER ;
这是由 root 用户创建的。
但是,当调用的用户test
运行此函数时,在 中show processlist
,这就是我所看到的。因此,看起来用户root
正在运行它。
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) |
我尝试查询以information_schema.processlist
查看用户,但它返回的信息与用户 root 似乎正在执行的信息相同。那么,有没有办法在进程列表中显示是谁test
在运行这个进程呢?如果不是,我如何找出谁真正调用了这个函数?
这是创建或更改函数时围绕这两个概念的 、 和默认行为
DEFINER
的INVOKER
组合。当您创建函数时,除非您明确声明,否则它会将 捕获
CURRENT_USER()
为。DEFINER
在您的示例中,这默认为root
用户。当您的函数被调用时,将执行安全检查以提供执行上下文。由于您的函数有一个
DEFINER
ofroot
,因此查询两者SHOW PROCESSLIST
并将SELECT * FROM information_schema.processlist
返回调用用户,root
即使test
正在调用它。如果您将函数更改为我下面的内容,它应该捕获
CURRENT_USER()
(例如root
或创建者)作为语法DEFINER
的原因DEFINER=CURRENT_USER()
。当调用下面的函数时,查询
SHOW PROCESSLIST
或SELECT * FROM information_schema.processlist;
将显示该函数正在由INVOKER
- 执行,在本例中是test
因为SQL SECURITY INVOKER
指定了语法。请记住:
SQL SECURITY DEFINER
意味着该函数将被执行并报告为DEFINER
和 且具有 可用的权限DEFINER
。SQL SECURITY INVOKER
意味着您的函数将在 的权限下执行INVOKER
,并在检查进程时报告为INVOKER
。编辑:清理了一些示例代码和解释。