此操作需要SUPER权限。

25
我在我的共享服务器上使用(数据库-> MySQL数据库->添加新用户)创建了我的数据库和用户 navid ,然后为用户 navid 选择了ALL PRIVILEGES。当我导入mydatabase.sql 时,遇到了此错误。

如何修复错误? 在 localhost 中,存储过程运行正常。


什么是SUPER特权?

Error
SQL query:
DELIMITER $$--
-- Procedures
--
CREATE DEFINER = `navid`@`%` PROCEDURE `d_answer` ( OUT `sp_out` INT( 11 ) , IN `sp_id` INT( 11 ) ) NO SQL BEGIN DELETE FROM `tblname` WHERE `a_id` = sp_id;
SET sp_out = ROW_COUNT( ) ;
END$$

MySQL said: Documentation
#1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation 

@Ben - 你是什么意思? - navid
我不知道如何在共享服务器上授予SUPER权限以执行此操作。 - navid
3
我在质疑为什么有人懦弱地对你的问题进行了负投票(即没有给出任何关于原因的反馈)。我认为那是一个值得思考的问题。 - Ben
3
@Ben - 谢谢你,Ben,你是个好人 :)。 - navid
5个回答

37

来自文档 (我强调的部分):

SUPER特权使一个账户能够使用CHANGE MASTER TO、KILL或mysqladmin kill命令杀死属于其他账户的线程(您总是可以杀死自己的线程)、PURGE BINARY LOGS、使用SET GLOBAL修改全局系统变量的配置更改、mysqladmin debug命令、启用或禁用日志记录、即使启用了read_only系统变量也执行更新操作、在从服务器上开始和停止复制,以及在存储程序和视图的DEFINER属性中指定任何账户,并使您连接(一次),即使达到由max_connections系统变量控制的连接限制。

由于您已经是数据库的navid,因此您不需要设置存储过程中的DEFINER属性;添加这行代码会导致错误显示。如果您删除此语句,则可以创建存储过程且不会出现权限错误。

仅当您为其他用户设置存储过程时才需要设置DEFINER,默认情况下存储过程将获得与创建该对象的用户相同的安全上下文:

所有存储过程(包括过程、函数和触发器)和视图都可以具有命名为MySQL账户的DEFINER属性。如果从存储程序或视图定义中省略DEFINER属性,则默认账户是创建对象的用户。


真的吗?在我的存储过程中不需要使用定义者吗? - navid
2
不,你只有在代表另一个用户设置存储过程时才需要这样做;而且为了做到这一点,你需要拥有SUPER权限。 - Burhan Khalid
请检查定义者,除非明确需要,否则不应为username@localhost,而应为username@% - Marco Marsala

9
我也遇到了同样的问题,并在MySQL Workbench中解决了它。 在我的情况下,是因为“发送到SQL编辑器>创建语句”中有额外的内容,这些内容需要进行修改才能使用。
类似于这样: CREATE ALGORITHM=UNDEFINED DEFINER=schemax@localhost SQL SECURITY DEFINER VIEW viewName AS SELECT ....
将其更改为: CREATE VIEW viewName AS SELECT ....
现在似乎可以正常工作,无需更新权限。 **我是我的数据库的唯一用户。

非常感谢您。 - Divakarcool
请检查定义者,除非明确需要,否则不应为username@localhost,而应为username@% - Marco Marsala

1

只需删除DEFINER属性及其值,例如:

CREATE ALGORITHM=UNDEFINED  SQL SECURITY DEFINER VIEW ...

1

我遇到了同样的问题 - 在我的本地开发服务器上,一切正常,但在我的托管服务器上(通过PHPMyAdmin),它给了我上面的错误。

如果您希望definer是当前用户,则删除definer属性似乎是解决问题的最简单方法。


检查定义者,除非明确需要,否则不应为username@localhost,而应为username@% - Marco Marsala

0

不要依赖默认值,如果在phpMyAdmin或其他程序中清空定义者字段无法解决问题,请检查定义者,它不应该是username@localhost,除非明确需要,而应该是username@%


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接