MySQL:DEFINER对程序和功能有什么影响?

时间:2016-04-27 11:15:02

标签: mysql stored-procedures

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

当我使用SQLYog编写程序时,例如

CREATE PROCEDURE age_frequency_count(IN bin_size INT)

由此产生的程序得到了我喜欢与否的定义,导致

CREATE DEFINER=<the_user_name>@<my_IP_address> PROCEDURE age_frequency_count(IN bin_size INT)

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

从阅读文档和SO上的帖子,我有一个粗略的,但相当困惑的想法是如何使用定义器来说明执行或可能改变过程所需的权限以及允许的过程要做,但我欢迎一些澄清。

问题

如果我的IP地址在定义者中,那么从其他IP地址登录的用户仍然可以执行 <(>使用相同的用户名)?

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

1 个答案:

答案 0 :(得分:3)

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

通过这种方式, minion 只能执行指定的存储过程,并且没有EXECUTEUPDATEDELETESELECT或者数据库表上的其他权利。

我希望这有助于构建DEFINER子句背后的理念。使用它将电源任务分开。

您是正确的,默认情况下,MySQL在创建存储过程时使用当前用户的标识作为INSERT。此标识可以是前端应用程序的标识(可以这么说),或者,就像我说的,您可以使用具有正常表权限的代理用户。然后,应用程序用户将是DEFINER,对存储过程minion只有一个权限。

简而言之,如果默认的EXECUTE用户没有表示前端应用程序用于登录数据库的内容,并且您希望这样做,那么您需要使用DEFINER更改存储过程,如果可能的话。

另一方面,更好的想法是使用minon / proxy方案。 Internet上的应用程序用户与存储过程ALTER子句中最终的IP无关。重要的是您的应用从哪里登录到MySQL的IP。您的应用正在与数据库进行通信,而不是人们的用户代理。电脑。然而,这个概念通常是最初的混淆点。你很好!

希望有所帮助。