MySQL存储过程是否可以有多个用户作为定义者?

3
我在MySQL存储过程方面遇到了一些困难,感到有点沮丧。我有一组由Bob创建的SPs。由于他是定义者,只有他能看到它们的CREATE语句,修改等。
Mary可以在MySQL Workbench中的模式中看到Bob的存储过程,但无法看到它们的作用-当她点击SP并选择“发送到SQL编辑器-> CREATE语句”时,什么也不会发生,因为她不是定义者。
对于我来说,这有点奇怪,因为我来自MS SQL背景。是否有任何方法可以设置一个组(例如“DB_DEVS”)并使这个组成为存储过程的定义者,以便Bob和Mary可以看到彼此的代码?
1个回答

5

DEFINER 通常指创建存储过程的用户,这只能是一个用户。

如果 Mary 想要查看 Bob 的存储过程,她可以调用:

SHOW CREATE PROCEDURE proc_name

要查看该过程的代码。她也可以调用以下方法来查看代码:

SELECT ROUTINE_DEFINITION FROM information_schema.ROUTINES WHERE SPECIFIC_NAME='proc_name'

以下是“如何使Mary能够通过MySQL-Workbench访问存储过程视图”的翻译:

以下是如何使Mary能够通过MySQL-Workbench访问存储过程视图的方法:

默认情况下,Mary无法向SQL-Editor发送创建语句。但这只是一个权限问题。Mary只需要在mysql.proc表中具有基本的SELECT权限即可。为此,可以通过命令行或直接在Workbench中运行以下SQL语句:

GRANT SELECT ON mysql.proc TO 'mary'@'%'

此命令允许Mary从所有主机访问Create-Statement。如果您想将其限制为特定主机,则可以执行以下操作:

GRANT SELECT ON mysql.proc TO 'mary'@'192.168.2.1'

如果Mary有SELECT权限,她应该可以在执行“Send to SQL Editor -> CREATE statement”之后看到存储过程。
注意:为了运行GRANT命令,您需要以具有授予权限的用户身份登录(例如root用户)。
编辑:有一种“快速且简单”的方法可实现此目标,适用于大量用户而无需为每个用户编写新的命令以授予权限:(确保使用具有通过Workbench插入行的权限的用户执行此操作)
1. 在Workbench中打开一个新的SQL选项卡 2. 输入“SELECT * FROM mysql.tables_priv;”并运行它 3. 在结果网格上方应该有一个小按钮,允许您从csv文件导入数据。 4. 创建一个类似于以下内容的CSV文件: %,mysql,jane,proc,root@localhost,"2016-02-19 22:51:47",Select, %,mysql,max,proc,root@localhost,"2016-02-19 22:51:47",Select, %,mysql,steve,proc,root@localhost,"2016-02-19 22:51:47",Select, %,mysql,greg,proc,root@localhost,"2016-02-19 22:51:47",Select, %,mysql,jamie,proc,root@localhost,"2016-02-19 22:51:47",Select, ...更多用户 jane、max、steve等是您的用户。 其他列保持不变。 5. 导入您的csv文件 6. 在SQL窗口中运行“FLUSH PRIVILEGES”(重新加载特权表中的特权) 7. 完成! 您的所有用户现在都可以访问存储过程。

这个方法很有效 - 但在 MySQL Workbench 的设计中提供该选项却又不让它生效似乎有点非常规。对每个用户进行此权限添加(在我这种情况下需要使用 root)似乎要求有点过高了!感谢您的帮助,非常感激。 - Mr Angry
@MrAngry:如果你有大量的用户,而且懒得为每个用户输入这个命令,那么有一种“快速而肮脏”的方法可以更快地实现。请看我的编辑... - MikeVe
谢谢Nate - 我现在只有很少的用户,所以暂时可能会手动完成,不过额外的信息也很有用。我只是惊讶于没有更加“强大”或“官方”的方式来完成似乎是一个相当标准的要求的事情。 - Mr Angry
谢谢。你救了我的一天。我使用Workbench作为客户端并创建了一个SP。几天后,我的IP地址发生了变化,之后由于SP定义子句中的IP不匹配,我无法使用mysql workbench修改SP。现在使用GRANT SELECT ON mysql.proc TO 'user'@'%'。现在我可以从mysql workbench客户端打开/读取SP了。 - Sohel Pathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接