我需要我的MySQL数据库对特定列中的一些值求和。为此,我使用了触发语句,但MySQL给了我一个错误:
MySQL错误:#1142-表wp_wpdatatable_8的用户'XXXXXX'拒绝了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
我该怎么做? 谢谢
答案 0 :(得分:1)
您对正在使用的数据库缺少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 |
+-------------+-----------+--------+-------------+----------------+-----------+-----------+--------+
答案 1 :(得分:1)
这里的问题似乎与您的用户对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 :(得分:0)
如果我使用
GRANT TRIGGER ON wordpress-5478r34b.* TO '_sso_67c5vh1'@'10.3.157.568'
或
GRANT TRIGGER ON'wordpress-3236c57b'。* TO'_sso_35fd3dc2'@'10.3.156.140'
或
GRANT TRIGGER ON 'wordpress'-'3236c57b'.* TO '_sso_35fd3dc2'@'10.3.156.140'
无论我做什么,都会给我一个语法错误。
通常,我想做的是在数据库中添加新数据时的自动求和。有更简单的方法吗?