MySQL 错误:#1142 - 触发命令被拒绝

问题描述 投票:0回答:2

我需要我的 MySQL 数据库对特定列中的某些值进行求和。为此,我使用了触发器语句,但我从 MySQL 收到错误:

MySQL 错误:#1142 - 拒绝用户“XXXXXX”对表 wp_wpdatatable_8 执行 TRIGGER 命令

触发代码如下所示:

CREATE TRIGGER SumPliche 
AFTER INSERT ON wp_wpdatatable_8 
FOR EACH ROW 
    UPDATE wp_wpdatatable_8 
    SET sommapliche = tricipite + addome + soprailiaca + sottoscapolare + ascellare + pettorale + coscia

我怎样才能做到这一点?

谢谢

mysql triggers sql-grant
2个回答
4
投票

这里的问题似乎与您的用户对数据库的权限有关,

wp_wpdatatable_8

要为特定用户和数据库授予触发器权限,可以使用以下命令:

mysql> GRANT TRIGGER ON <DATABASE>.* TO <USER>@'<DATABASE HOST>';

哪里

  • <DATABASE>
    指包含
    wp_wpdatatable_8
    表的数据库。
  • <USER>
    尝试发出
    CREATE TRIGGER
    命令的用户名。
  • <DATABASE HOST>
    用户访问数据库的数据库主机。如果您在本地运行,则可以使用
    localhost

刷新权限后,创建触发器应该可以正常工作。

有关更多信息,请查看 MySQL.documentation 上的

GRANT
语法


2
投票

您缺乏正在使用的数据库的 TRIGGER 权限。

我在测试时遇到了这个错误。创建测试用户:

mysql> create user 'bill'@'localhost';
mysql> grant all privileges on test2.* to 'bill'@'localhost';
mysql> revoke trigger on test2.* from 'bill'@'localhost';
mysql> show grants for 'bill'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for bill@localhost                                                                                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'bill'@'localhost' IDENTIFIED BY PASSWORD '*29A1BB43D3B9EB42028B4566E4836353285B9395'                                                                                                                  |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT ON `test2`.* TO 'bill'@'localhost' |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

现在尝试以此用户身份创建触发器:

~ mysql -ubill -p
mysql> use test2
mysql> create table t ( i int);
mysql> create trigger tt before insert on t for each row set new.i = 42;
ERROR 1142 (42000): TRIGGER command denied to user 'bill'@'localhost' for table 't'

我还认为你的触发器可能不会像你想象的那样做,所以最好不是你创建它。

CREATE TRIGGER SumPliche AFTER INSERT ON wp_wpdatatable_8 
FOR EACH ROW 
  UPDATE wp_wpdatatable_8 
  SET sommapliche = tricipite + addome + soprailiaca + sottoscapolare + ascellare + pettorale + coscia

如果我在测试数据库中创建此触发器(作为具有 TRIGGER 权限的不同用户),然后尝试插入一行:

mysql> insert into wp_wpdatatable_8 values (1, 1, 1, 1, 1, 1, 1, 1);
ERROR 1442 (HY000): Can't update table 'wp_wpdatatable_8' in 
stored function/trigger because it is already used by statement which invoked 
this stored function/trigger.

您可能只想在插入的行中设置值。如果是这样,您将使用

NEW.*
语法引用当前插入的行:

CREATE TRIGGER SumPliche BEFORE INSERT ON wp_wpdatatable_8 
FOR EACH ROW 
  SET NEW.sommapliche = NEW.tricipite + NEW.addome + NEW.soprailiaca 
    + NEW.sottoscapolare + NEW.ascellare + NEW.pettorale + NEW.coscia;

此外,如果您想在插入行之前更改该行中的值,则必须使用

BEFORE INSERT
。如果你使用
AFTER INSERT
,那就太晚了。

现在可以使用了:

mysql> insert into wp_wpdatatable_8 values (1, 1, 1, 1, 1, 1, 1, 1);
Query OK, 1 row affected (0.02 sec)

mysql> select * from wp_wpdatatable_8;
+-------------+-----------+--------+-------------+----------------+-----------+-----------+--------+
| sommapliche | tricipite | addome | soprailiaca | sottoscapolare | ascellare | pettorale | coscia |
+-------------+-----------+--------+-------------+----------------+-----------+-----------+--------+
|           7 |         1 |      1 |           1 |              1 |         1 |         1 |      1 |
+-------------+-----------+--------+-------------+----------------+-----------+-----------+--------+
© www.soinside.com 2019 - 2024. All rights reserved.