Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:我如何允许用户B在不给用户A全局选择权限的情况下修改用户A的过程?_Mysql_Stored Procedures_User Permissions - Fatal编程技术网

MySQL:我如何允许用户B在不给用户A全局选择权限的情况下修改用户A的过程?

MySQL:我如何允许用户B在不给用户A全局选择权限的情况下修改用户A的过程?,mysql,stored-procedures,user-permissions,Mysql,Stored Procedures,User Permissions,所以,最初的问题是,在MySQL Workbench中,我试图改变过程,但什么都没有得到。没有错误,只是什么也没发生。事实证明,尽管由于存储过程的定义者不是我,所以我拥有模式的完全权限,但我无法查看它的源代码 情景: Database: Bugs Users: A, B Permissions: grant all privileges on bugs.* to 'A'@'%' grant all privileges on bugs.* to 'B'@'%' 用户A创建一个存储过程 cre

所以,最初的问题是,在MySQL Workbench中,我试图改变过程,但什么都没有得到。没有错误,只是什么也没发生。事实证明,尽管由于存储过程的定义者不是我,所以我拥有模式的完全权限,但我无法查看它的源代码

情景:

Database: Bugs
Users: A, B
Permissions: 
grant all privileges on bugs.* to 'A'@'%'
grant all privileges on bugs.* to 'B'@'%'
用户A创建一个存储过程

create procedure user_A_procedure ...
我们现在有一个过程用户\u a\u prodecure,其定义者设置为a@% 将安全类型设置为DEFINER

字符集客户端:utf8 排序规则\u连接:utf8\u常规\u ci 数据库排序规则:utf8\u常规\u ci

问题是,用户B希望能够编辑过程,因为他们没有访问原始源的权限,但他们不能。在MySQL Workbench中,当他们尝试更改过程时,什么都不会发生,在命令提示符下,他们看不到源代码

mysql> SHOW CREATE PROCEDURE user_A_procedure
           Procedure: user_A_procedure
            sql_mode: 
    Create Procedure: NULL
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
这不会像执行源代码的用户那样返回源代码,而是返回NULL

事实证明,要使用MySQL Workbench或SHOW CREATE PROCEDURE查看另一个定义者的存储过程,必须向用户授予全局选择权限[1]

全局选择让用户能够读取每个数据库中的所有内容,这不是一个理想的选项

所以我的问题是:我如何允许用户A查看/更改用户B的过程而不给他们全局选择权限

参考资料:


MySQL 8.0文档的外观发生了更改,并包含一个错误

此语句是MySQL扩展。它返回的字符串与 可用于重新创建命名存储过程。相似的 语句,SHOW CREATE函数,显示有关存储 函数见第13.7.6.8节“显示创建函数语法”

要使用任一语句,您必须具有全局选择权限

来源

vs MySQL 5.7文档

此语句是MySQL扩展。它返回的字符串与 可用于重新创建命名存储过程。相似的 语句,SHOW CREATE函数,显示有关存储 函数见第13.7.5.8节“显示创建函数语法”

要使用任一语句,您必须是例程中指定的用户 DEFINER子句或具有对mysql.proc表的SELECT访问权限。如果你 没有例程本身的权限,该值显示为 “创建过程”或“创建函数”字段将为空


来源

全局选择权限?您确定用户不仅需要mysql.proc上的select权限吗?因为基本上我假设该语句只从mysql.proc读取。这很有效,谢谢。你想添加这个作为答案吗?我注意到MySQL 5.7文档从一开始就有正确的答案。。有时候在MySQL文档中更改MySQL版本是很有用的,谢谢。这正是我遵循的您强调的语句。mysql中不再存在表'mysql.proc'。我签入了mysql 8.0。无法找到任何方法将alter SP权限授予非定义者的用户。我必须授予全局选择权限。这就是mysql 8.0中的工作方式。表'mysql.proc'在mysql中已经不存在了,所以必须给非定义者的用户全局选择权限来更改过程。
mysql> SHOW CREATE PROCEDURE user_A_procedure
           Procedure: user_A_procedure
            sql_mode: 
    Create Procedure: NULL
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci