【问题标题】:Is there an equivalent for this trigger in stored procedures存储过程中是否有此触发器的等效项
【发布时间】:2012-11-13 16:20:16
【问题描述】:

我一直在专用服务器上使用这个 MySQL 触发器,所以每次更新一个表时,它都会计算一个新的总和并更新另一个表:

delimiter |
CREATE TRIGGER after_insert_rep_points AFTER INSERT ON users_reputation
FOR EACH ROW
BEGIN
DECLARE new_total INT(10);
SELECT SUM(rep_points) INTO new_total FROM users_reputation
WHERE user_id = NEW.user_id;
UPDATE users SET rep_total = new_total WHERE user_id = NEW.user_id;
END
|
delimiter ;

我现在需要在共享主机环境中使用它,但不幸的是,由于安全预防措施,我不能在共享环境中拥有 SUPER USER 权限,这是触发器所必需的。我不明白这一点。我认为每个人都应该能够使用触发器。

我对存储过程不太了解,事实上我没用,但我想知道这个查询是否可以使用一个来执行,如果可以,任何人都可以给我任何指示吗?

【问题讨论】:

  • 抱歉,您将无法使用您的代码。 TRIGGER、STORED PROCEDURE 和 FUNCTION 需要创建和执行超级用户帐户。
  • @sdespont:根据我的托管支持:“允许确定性存储过程/例程。不允许存储函数和触发器”。

标签: mysql


【解决方案1】:

编写触发器的人显然SQL技能非常有限——整个主体可以表示为一个简单的查询:

UPDATE users SET
rep_total = (SELECT SUM(rep_points) 
    FROM users_reputation 
    WHERE user_id = users.user_id)
WHERE user_id = ?; -- "?" is NEW.user_id inside the trigger. You must provide it

您不需要存储过程 - 只需运行此查询即可。

【讨论】:

  • 显然,使用触发器的原因是因为users_reputation 中有大约 60m 行,它旨在加快获取 SUM 并在需要时删除点。您的回答是否仍然适用于这种情况?
  • 在阅读了有关触发器/存储过程的信息后,我不确定您的答案是否正确。在具有 6000 万行的表上使用触发器/存储过程,以使用 SUM 更新另一个表,肯定比运行必须先计数然后更新的查询更快?使用触发器允许我使用一个快速的 INSERT 查询。您能否确认您的陈述仍然正确?
  • 我的说法是“正确的”,但我会解释。 rep_total 是每个用户的所有 rep_points 的总数 denormalized。该触发器自动保持总数正确 - 每当基础数据更改时触发,重新计算总数并更新它。我的查询正是这样做的,不使用变量(因此不需要存储过程),但如果使用,则应用程序必须在应用程序更改users_reputation 中的数据时显式调用(作为额外查询)。总速度只会稍微慢一点。
猜你喜欢
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2016-12-02
  • 2018-01-18
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多