我使用create procedure sp\u test()创建了一个存储过程。。。
已成功创建sp。然后,在运行call sp\u test()时,出现一个错误,提示“拒绝用户''@“%”访问数据库'db'”
以下是我的特权:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `%`.* TO 'xxx'@'%'
我尝试按照so问题中的建议创建definer='root'@“%”过程sp\u test(),但遇到了一个错误:access denied;此操作需要(至少一个)超级权限“
我需要什么额外的特权?将特权授予用户的sql语句是什么?我正在amazon web服务上使用MySQL5.6.10(rds)
1条答案
按热度按时间biswetbf1#
你需要
EXECUTE
运行call语句以运行过程的权限。https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html 说:
create过程和create函数需要create routine权限。它们可能还需要超级特权,这取决于定义者的值。。。
换句话说,只有在创建过程时希望将定义者指定给自己以外的其他用户时,才需要超级权限。
在amazonrds中,mysql用户不能拥有超级权限。这是他们的政策。你不能
GRANT SUPER
任何你可以使用的用户。因此,不能为过程、函数、触发器或视图设置definer。如果必须还原包含definer子句的数据库,则必须首先将其编辑掉。
另请参见:
https://aws.amazon.com/premiumsupport/knowledge-center/definer-error-mysqldump/
https://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/
因此,您不能依赖过程的定义者来授予会话对通常没有权限访问的表的访问权限。当您使用rds时,mysql的这个功能是不可用的。mysql用户必须具有直接权限才能访问过程访问的任何表。如果你不这样做,你就会出错。
如果您需要该功能,您将不得不放弃使用rds,而是自己在ec2示例上运行mysql服务器。