MySQL:DEFINER 对过程和函数有什么影响?

use*_*752 5 mysql stored-procedures

我使用 SQLyog 在我正在开发的远程 MySQL 数据库中编写过程和函数。数据库只有一个用户名/密码。它是通过我用 Delphi 编写的前端可执行应用程序访问的,它被几十个不同的人使用,所有人都使用相同的用户名。

例如,当我使用 SQLYog 编写一个过程时,

CREATE PROCEDURE age_frequency_count(IN bin_size INT)
Run Code Online (Sandbox Code Playgroud)

无论我喜欢与否,结果过程都会将定义器放入,从而导致

CREATE DEFINER=<the_user_name>@<my_IP_address> PROCEDURE age_frequency_count(IN bin_size INT)
Run Code Online (Sandbox Code Playgroud)

(我认为这是由 MySQL 完成的,而不是由 SQLYog DBMS 完成的。)

通过阅读文档和 SO 上的帖子,我对如何使用定义器说明执行或更改程序所需的权限以及允许程序执行的操作有一个粗略但相当混乱的想法,但我希望得到一些澄清。

如果我的 IP 地址在定义器中,该过程是否仍然可以被其他将从不同 IP 地址登录的人执行(尽管使用相同的用户名)?

有人可以澄清定义者在做什么吗?即来自我的 IP 地址的连接能做什么而来自其他 IP 地址的连接不能?

Ant*_*dge 5

我用的是DEFINER子句创建与还具有强大的用户的安全权限的存储过程UPDATEDELETESELECT,和INSERT权到特定的数据库表。然后,我只EXECUTE将该存储过程授予一个minon用户(有些人称其为www用户,而不是更强大的wwwproxy用户)。

通过这种方式,在仆从只能执行指定的存储过程和没有UPDATEDELETESELECTINSERT,对数据库表或其他权利。

我希望这有助于构建 DEFINER 子句背后的想法。用它来将权力任务分开。

您是对的,默认情况下,MySQL 使用当前用户的身份作为DEFINER创建存储过程时的身份。这个身份可以是前端应用的身份(可以这么说),或者,就像我说的,你可以使用具有普通表权限的代理用户。那么应用程序用户将是minion对存储过程只有一项特权的用户EXECUTE

简而言之,如果默认DEFINER用户不代表前端应用程序用于登录数据库的内容,而您希望它如此,那么ALTER如果可能,您需要使用 更改存储过程。

另一方面,更好的主意是使用 minon/proxy 场景。Internet 上的应用程序用户与存储过程DEFINER子句中的 IP 无关。重要的是您的应用程序从哪里登录到 MySQL 的 IP。您的应用程序正在与数据库对话,而不是与人们计算机上的用户代理对话。然而,这个概念通常是一个最初的混淆点。你很好!

希望有帮助。

  • @Shadow 我的电脑崩溃了。对不起!:-) (2认同)