Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 检测更新查询是否来自触发器_Mysql_Triggers - Fatal编程技术网

Mysql 检测更新查询是否来自触发器

Mysql 检测更新查询是否来自触发器,mysql,triggers,Mysql,Triggers,我有一个名为的表,用于存储用户评级。在每次插入时,我都会运行下面的触发器来更新抵押模板表中的ratingscont和rating列: CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeRating_AFTER_INSERT` AFTER INSERT ON `pledgeRating` FOR EACH ROW BEGIN UPDATE `pledgeTemplate` SET `rating` = ((`r

我有一个名为的表,用于存储用户评级。在每次插入时,我都会运行下面的触发器来更新
抵押模板
表中的
ratingscont
rating
列:

CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeRating_AFTER_INSERT` AFTER INSERT ON `pledgeRating` FOR EACH ROW
BEGIN
    UPDATE `pledgeTemplate` 
        SET `rating` = ((`rating` * `ratingsCount`) + NEW.rating) / (`ratingsCount` + 1),
            `ratingsCount` = `ratingsCount` + 1
        WHERE `id` = NEW.pledgeTemplateID;
END
为了完整性起见,我想阻止所有mysql用户直接更新
warketemplate
表中的
ratingscont
rating
列。我希望这两列只从触发器更新

为了实现这一点,我在
swarketemplate
表中创建了一个新触发器,以验证运行更新查询的用户,但我找不到检测该更新是否来自触发器的方法:

CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeTemplate_BEFORE_UPDATE` BEFORE UPDATE ON `pledgeTemplate` FOR EACH ROW
BEGIN
    IF (OLD.ratingsCount != NEW.ratingsCount OR OLD.rating != NEW.rating) AND {{Update query is not from the trigger}} THEN
        SIGNAL sqlstate '45000' SET message_text = 'Error: Only trigger can modify ratingsCount or rating columns';
    END IF;
END
是否可以从第一个触发器传递标志,以便在第二个触发器中检测查询是否来自该触发器?我查看了
CURRENT\u USER
对象和
USER()
函数,因为我认为它们可能会有所帮助。但是,
CURRENT\u USER
始终是设置为
DEFINER
的用户,并且
USER()
始终返回运行初始查询的用户

那么,是否有任何方法可以检测
质押模板
表上的更新查询是否从触发器或“直接”更新运行?

您好_

首先,我开始在一篇评论中解释我的想法,但似乎它太长,格式不好。所以这只是一个想法,我不知道你是否同意,但我将与你分享:

  • ALTER TABLE MARGETEMPLATE ADD列isTriggerUpdate BIT NULL默认值0-因此我们在表中添加了一列,我们可以使用该列作为标志来确定更新是来自触发器还是来自用户
  • 二,

    在插入后更改触发器的代码,将标志列设置为true

    三,

    现在,您可以在更新之前在质料模板中找到缺少的条件,如下所示

    我认为这将作为逻辑工作,但问题是,这是实现这一点最有效的逻辑吗。在这种逻辑中,在任何情况下都不必向前端公开isTriggerUpdate列,因为只要将其设置为true,就会绕过这种逻辑

    祝你好运

    你好_

    首先,我开始在一篇评论中解释我的想法,但似乎它太长,格式不好。所以这只是一个想法,我不知道你是否同意,但我将与你分享:

  • ALTER TABLE MARGETEMPLATE ADD列isTriggerUpdate BIT NULL默认值0-因此我们在表中添加了一列,我们可以使用该列作为标志来确定更新是来自触发器还是来自用户
  • 二,

    在插入后更改触发器的代码,将标志列设置为true

    三,

    现在,您可以在更新之前在质料模板中找到缺少的条件,如下所示

    我认为这将作为逻辑工作,但问题是,这是实现这一点最有效的逻辑吗。在这种逻辑中,在任何情况下都不必向前端公开isTriggerUpdate列,因为只要将其设置为true,就会绕过这种逻辑


    祝你好运

    我认为这是不可能的,但是您可以为您的用户删除相应表的更新权限。问题是,我仍然需要我的用户更新
    质押模板
    表。如果我删除更新权限,那么我将停止所有更新。我只是想保护这两列不被触发器更新。我认为这是不可能的,但是你可以为你的用户删除相应表的更新权限。问题是我仍然需要我的用户更新
    质押模板
    表。如果我删除更新权限,那么我将停止所有更新。我只是想保护这两列不被更新,而不是被触发。
    CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeRating_AFTER_INSERT` 
    AFTER INSERT ON `pledgeRating` FOR EACH ROW
    BEGIN
        UPDATE `pledgeTemplate` 
            SET `rating` = ((`rating` * `ratingsCount`) + NEW.rating) / (`ratingsCount` + 1),
                `ratingsCount` = `ratingsCount` + 1,
                `isTriggerUpdate ` = 1
            WHERE `id` = NEW.pledgeTemplateID;
    END
    
    CREATE DEFINER=`trigger`@`%` TRIGGER `project87`.`pledgeTemplate_BEFORE_UPDATE` 
    BEFORE UPDATE ON `pledgeTemplate` FOR EACH ROW
    BEGIN
        IF (OLD.ratingsCount != NEW.ratingsCount OR OLD.rating != NEW.rating) 
           AND NEW.isTriggerUpdate != 1 THEN
            SIGNAL sqlstate '45000' SET message_text = 'Error: Only trigger can modify ratingsCount or rating columns';
        END IF;
    END