如何向用户授予对特定存储过程的执行权限

9

我在特定的模式下创建了一些存储过程。

在这些存储过程中,我想要授予执行权限。

因此我编写了以下代码:

GRANT EXECUTE ON PROCEDURE schema_name.proc_name TO 'user_name';
GRANT SELECT ON mysql.proc to 'user_name';

问题是:我的用户可以看到所有存储过程。 我希望他只能看到他拥有EXECUTE权限的存储过程。 有什么方法可以实现吗? 先谢谢了。
2个回答

6

如果您不直接或间接地授予用户对mysql.proc表的SELECT权限(例如使用GRANT SELECT ON *.* TO ...),则此方法可以按预期工作。

没有对此表的SELECT权限,用户只能看到他们拥有其他权限(如EXECUTE)的存储过程和存储函数的存在。

在幕后,缺少对mysql.procSELECT权限还会防止用户通过information_schema.routines伪表查看他们无权访问的过程。

您不应该需要GRANT SELECT ON mysql.proc来使用户能够执行过程或函数...如果您这样做了,那么问题就出在那里。


事实上,似乎是我的插件引起了这个问题。我正在使用MySQLForExcel让用户与数据库进行交互。 你说得对,如果没有SELECT ON mysql.proc,我可以无问题地调用我的存储过程。但由于某些不明原因,MySQLForExcel不允许这样做... 无法检索程序 'truncate_t_qcms_lead_engineer' 的存储过程元数据。为此用户授予mysql.proc的SELECT权限或在连接字符串中使用“check parameters=false”。 - TriGerZ

-1

问题已解决。

实际上,为了能够在MySQLForExcel中执行存储过程,我们需要设置每个存储过程的定义者,以便MySQLForExcel用户调用。

DELIMITER $$

DROP PROCEDURE IF EXISTS `procedure_name` $$
CREATE DEFINER=`user_mysqlforexcel` PROCEDURE `procedure_name`(param)
BEGIN
     Do smth as usual
END $$

我在这里找到了

谢谢帮助。


实际上,那个方法之所以可行是因为错误的原因,并且可能存在安全隐患。正确的解决方案可能在原始错误消息中:您需要在ODBC连接字符串中设置CheckParameters=false来禁用导致错误的ODBC中的问题。 - Michael - sqlbot

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