我有两个数据库,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
答案 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;
找到过程定义中的当前定义者。