所以,最初的问题是,在mysql工作台中,我试图改变过程,但一无所获。没有错误,只是什么都没发生。事实证明,尽管由于存储过程的定义者不是我,所以我拥有模式的完全权限,但我无法查看它的源代码。
脚本:
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 ...
我们现在有一个程序 user_A_prodecure
你是谁 definer
设置为 A@%
与 security_type
设置为 DEFINER
```
mysql> SHOW PROCEDURE STATUS\G
Db: bugs
Name: user_A_prodecure
Type: PROCEDURE
Definer: A@%
Modified: 2018-10-26 10:30:06
Created: 2018-10-26 10:30:06
Security_type: DEFINER
Comment:
字符集\客户端:utf8排序规则\连接:utf8\常规\ ci数据库排序规则:utf8\常规\ ci
问题是,用户b希望能够编辑这个过程(他们不能访问原始源代码),但是他们不能。在mysqlworkbench中,当他们尝试更改过程时,什么都不会发生,在命令提示符下,他们看不到源代码
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查看另一个定义者的存储过程,用户必须获得global select权限[1]。
global select使用户能够读取每个数据库中的所有内容,这不是一个理想的选择。
所以我的问题是:我如何允许用户a在不给他们全局选择权限的情况下查看/更改用户b的过程?
参考文献:
https://dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html
https://dev.mysql.com/doc/refman/8.0/en/stored-programs-security.html
1条答案
按热度按时间ftf50wuq1#
mysql 8.0文档的外观发生了变化,并且包含一个错误。
此语句是mysql扩展。它返回可用于重新创建命名存储过程的确切字符串。类似的语句show create function显示有关存储函数的信息(请参阅第13.7.6.8节“show create function语法”)。
要使用任一语句,必须具有全局选择权限。
来源https://dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html
与MySQL5.7文档对比。
此语句是mysql扩展。它返回可用于重新创建命名存储过程的确切字符串。类似的语句show create function显示有关存储函数的信息(请参阅第13.7.5.8节“show create function语法”)。
要使用任一语句,您必须是routinedefiner子句中指定的用户,或者对mysql.proc表具有select访问权限。如果您没有例程本身的权限,则为create procedure或create function字段显示的值将为null。
来源https://dev.mysql.com/doc/refman/5.7/en/show-create-procedure.html