【问题标题】:MySQL Error: #1142 - TRIGGER command deniedMySQL 错误:#1142 - TRIGGER 命令被拒绝
【发布时间】:2018-09-02 16:10:06
【问题描述】:

我需要我的 MySQL 数据库对特定列中的一些值求和。为此,我使用了 trigger 语句,但 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


    【解决方案1】:

    这里的问题似乎在于您的用户对 wp_wpdatatable_8 所在数据库的权限。

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

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

    在哪里

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

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

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

    【讨论】:

    • 很好的答案,但仅供参考,没有必要使用 FLUSH PRIVILEGES。 GRANT 或 REVOKE 会自动执行此操作。只有当您直接在系统表上使用 INSERT/UPDATE/DELETE 时,您才需要 FLUSH PRIVILEGES。使用 FLUSH PRIVILEGES 没有坏处,但没有必要。
    【解决方案2】:

    您对正在使用的数据库缺乏 T​​RIGGER 权限。

    我在进行测试时收到此错误。创建测试用户:

    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 |
    +-------------+-----------+--------+-------------+----------------+-----------+-----------+--------+
    

    【讨论】:

      【解决方案3】:

      如果我使用

      GRANT TRIGGER ON wordpress-5478r34b.* TO '_sso_67c5vh1'@'10.3.157.568'
      

      1064 - '-5478r34b.* TO '_sso_67c5vh1'@'10.3.157.568'' linea 1 附近的 SQL 查询语法错误

      在 'wordpress-3236c57b' 上授予触发器。* TO '_sso_35fd3dc2'@'10.3.156.140'

      1064 - ''wordpress-5478r34b' 附近的 SQL 查询中的语法错误。* TO '_sso_67c5vh1'@'10.3.157.568'' linea 1

      GRANT TRIGGER ON 'wordpress'-'3236c57b'.* TO '_sso_35fd3dc2'@'10.3.156.140'
      

      1064 - ''wordpress'-'5478r34b' 附近的 SQL 查询中的语法错误。* TO '_sso_67c5vh1'@'10.3.157.568'' linea 1

      无论我做什么,它都会给我一个语法错误。

      一般来说,当我在我的数据库中添加新数据时,我想做的是自动求和。有没有更简单的方法?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-12
        • 2013-01-03
        • 2018-11-13
        • 2012-07-17
        • 2016-12-20
        • 2016-01-21
        • 1970-01-01
        • 2011-11-10
        相关资源
        最近更新 更多