【问题标题】:Cursor in Mysql has other rights than user?Mysql中的游标除了用户之外还有其他权限吗?
【发布时间】:2023-03-17 07:18:01
【问题描述】:

我有两个数据库,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的权限可能不一样?

向索利克致敬

【问题讨论】:

  • 考虑显示你的程序代码

标签: mysql database stored-procedures cursor privileges


【解决方案1】:

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

存储的程序和视图是在使用之前定义的,当被引用时,它们会在确定其权限的安全上下文中执行。这些权限由它们的DEFINER 属性控制,如果有的话,它们的SQL SECURITY 特性控制。

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

如果您在创建存储程序(过程、函数、触发器或事件)或视图时未指定 DEFINER,则对象在访问时会以最初定义的用户的权限运行它,而不是调用它的用户。

这里有三个选项:

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

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

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

你可以在过程的定义中找到当前的定义器,SHOW CREATE PROCEDURE procedure_name;。

【讨论】:

  • 嗨,谢谢,但我做了更多调查,发现这似乎不是特权问题。我使用视图而不是过程调用做了一个解决方法。一旦我有时间,我将创建一个演示项目来显示问题并将其发布在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
相关资源
最近更新 更多