Mysql中的游标还有其他权限吗?

时间:2013-11-22 21:47:05

标签: mysql database stored-procedures cursor privileges

我有两个数据库,db1和db2。

用户man1拥有db1的所有权限,但只执行db2中所有函数和过程的权限。

从db1调用函数db2.getValue成功并返回正确的值,如果db2.getValue的调用嵌套在存储过程中也是如此。

现在我创建一个存储过程proc1,在此过程中,我使用游标从db1中的表中获取值(_val1,_val2, - )并调用db2.getValue(_val1)。

现在真的很奇怪:

游标的第一个循环结束,但db2.getValue的值为空。在循环结束时,循环结束并停止。

有没有人提示问题可能在这里?调用db1.getValue(_val1)而不是db2.getValue(_val1)可以正常工作。

因此我的想法是在游标中,db2的权限可能不一样?

亲切的问候Solick

1 个答案:

答案 0 :(得分:0)

是的,根据设计,如果调用该过程的用户执行游标,则游标的行为可能与同一SELECT查询的行为不同。

  

存储的程序和视图在使用之前定义,并且在引用时,在确定其权限的安全上下文中执行。这些权限由其DEFINER属性控制,如果存在,则由SQL SECURITY特征控制。

     

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

如果在创建存储程序(proc,function,trigger或event)或视图时未指定DEFINER,则在访问对象时,该对象将以用户的权限运行。最初定义它,而不是调用它的用户。

您有三个选项:

  • 如果合适,验证或可能修改当前DEFINER用户的权限;或者,
  • 在定义存储的程序或视图时指定不同的DEFINER用户...只要您(创建对象的人)具有SUPER权限,并且用户调用(访问)该对象将暂时拥有该DEFINER用户的权限;或者,
  • SQL SECURITY INVOKER添加到过程,函数和视图的定义中(尽管不是触发器或事件),导致对象以调用它的用户的权限运行,而不是定义者,这是默认行为。

要查看现有定义者拥有的权限,例如,如果您看到DEFINER =`someguy` @`localhost`:

mysql> SHOW GRANTS FOR 'someguy'@'localhost';

您可以使用SHOW CREATE PROCEDURE procedure_name;找到过程定义中的当前定义者。