在MySQL中创建触发器的权限

14

MySQL版本为5.0.67。

我的触发器代码如下:

DELIMITER //
CREATE TRIGGER upd_price BEFORE UPDATE ON product_price
 FOR EACH ROW BEGIN  
    INSERT INTO update_price_log (product_id, product_price_old, product_price_new) values(OLD.product_id, OLD.product_price, NEW.product_price);
END
//
DELIMITER ;

错误信息为:

#1227 - 拒绝访问;您需要 SUPER 权限才能进行此操作

我的服务器不是 cpanel,而是 DirectAdmin Web 控制面板。

我该如何创建 SUPER 权限并创建触发器?

4个回答

16

你必须拥有MySQL的root权限才能为用户设置SUPER权限。

GRANT SUPER 
ON '<database>'.'<tablename/*>' 
TO '<username>'@'<host/connection/ip/%>'; 

啊,那就是我的问题。我授予了本地主机用户的权限,但没有授予来自我的工作站的连接的权限。 - Mike
不再有效,您可以为自己的帐户设置触发器而无需超级权限。 - phil294
@Blauhirn 怎么办?我正在使用共享主机,无法创建触发器。 - Chaitanya Gadkari
你需要使用MySQL 5.1,参见https://dev59.com/aXjZa4cB1Zd3GeqPitSI#19823122。因此,你的答案仅适用于<= 5.0版本。我可以证实这一点,因为我最近在一个IaaS托管服务上使用触发器。 - phil294

6
我尝试在数据库表级别上授予 SUPER 权限,但失败了,所以我这样做了。
grant super on *.* to 'my_user'@'localhost';

然后创建我的触发器。但别忘了撤销它。

revoke super on *.* from 'my_user'@'localhost';

因为在互联网数据库中授权离开它是一项危险的特权。

3

一种在没有SUPER权限的情况下创建触发器的方法是将以下行添加到my.cnf或my.ini中:log_bin_trust_function_creators = 1

该设置可以让MySQL信任非SUPER权限用户创建触发器的功能。

1
设置这个也需要超级权限。 - Chaitanya Gadkari
使用MySQL 8.0,现在我得到了“SQL错误[1227] [42000]:拒绝访问;您需要(至少其中之一)SUPER或SET_USER_ID权限才能执行此操作”的提示。 - Mauricio

1
另一种解决这个bug的方法是禁用二进制日志记录,如果可接受的话。我这样做是因为我不使用复制服务器,也不会从binlog进行备份来进行恢复。但在你的情况下可能不合适。要执行此操作,只需在/etc/mysql/my.cnf中注释掉log_bin和log_bin_index行即可。现在,即使没有SUPER权限,触发特权也能正常工作。

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