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代码>-因此我们在表中添加了一列,我们可以使用该列作为标志来确定更新是来自触发器还是来自用户
ALTER TABLE MARGETEMPLATE ADD列isTriggerUpdate BIT NULL默认值0代码>-因此我们在表中添加了一列,我们可以使用该列作为标志来确定更新是来自触发器还是来自用户
祝你好运 我认为这是不可能的,但是您可以为您的用户删除相应表的更新权限。问题是,我仍然需要我的用户更新
质押模板
表。如果我删除更新权限,那么我将停止所有更新。我只是想保护这两列不被触发器更新。我认为这是不可能的,但是你可以为你的用户删除相应表的更新权限。问题是我仍然需要我的用户更新质押模板
表。如果我删除更新权限,那么我将停止所有更新。我只是想保护这两列不被更新,而不是被触发。
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