创建和调用存储过程所需的特权

时间:2018-07-17 21:23:56

标签: mysql amazon-web-services amazon-rds

我使用创建过程sp_test()...

创建了存储过程

sp已成功创建。然后我在运行调用sp_test()

时收到错误消息,提示“ 拒绝用户'xxx'@'%'访问数据库'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问题的建议尝试了 create DEFINER ='root'@'%'过程sp_test(),但遇到了一个错误,提示“ 访问被拒绝;您需要(至少一个此操作的SUPER权限

我需要什么额外的特权?授予用户xxx特权的sql语句是什么?我在Amazon Web Service上使用MySQL 5.6.10(RDS)

1 个答案:

答案 0 :(得分:0)

您需要具有EXECUTE特权才能运行CALL语句来运行过程。

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html说:

  

CREATE PROCEDURE和CREATE FUNCTION需要CREATE ROUTINE特权。他们可能还需要SUPER特权,具体取决于DEFINER值...

换句话说,只有在创建过程时要为除您之外的其他用户指定DEFINER时,才需要SUPER特权。

在Amazon RDS中,您的MySQL用户不能具有SUPER特权。那是他们的政策。您不能GRANT SUPER与任何可以使用的用户。

因此,您无法为过程,函数,触发器或视图设置DEFINER。如果必须还原包含DEFINER子句的数据库,则必须先对其进行编辑。

另请参阅:

因此,您不能依赖过程的定义来授予您的会话访问您通常没有特权的表的权限。使用RDS时,MySQL的该功能不可用。您的MySQL用户必须具有直接特权才能访问该过程访问的任何表。如果不这样做,则会出现错误。

如果需要该功能,则必须放弃使用RDS,而是自己在EC2实例上运行MySQL Server。