【问题标题】:Pervent rapid update of a column防止快速更新列
【发布时间】:2015-04-11 19:56:07
【问题描述】:

假设我的用户表上有一个名为current_status 的列 我希望该列的更新之间至少有 5 秒的间隔

换句话说,如果代码的一部分应该更新此列,那么在此之后的 5 秒内其他代码都不能更改它。

我知道 100 种在代码上做 tat 的方法,但我想在数据库级别做这主要是因为它的网站很大而且原始程序员不可用!

我正在考虑某种触发器或与时间有关的东西? 就是这样,现在我该如何应用 5 秒规则?

DELIMITER //
CREATE TRIGGER `status_update` BEFORE update ON `users`
 FOR EACH ROW IF OLD.current_status != NEW.current_status  THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update record for 5 sec ';
END IF
//
DELIMITER ;

我有一个名为status_changes 的表来跟踪这些变化,每次状态变化时我都会在这个表中添加一行

status_changes : id , user_id , timestamp , current_status

【问题讨论】:

  • 我确定我昨天看到了这个问题。反正。创建另一个表,它有一个字段,因此定义为last_update datetime。将此初始化为过去的某个时间。然后在您的触发器中,检查该字段的值。如果超过 5 秒前,则允许更新,并将该字段的值更新为 NOW()。
  • 如何检查触发时间是否超过 5 秒?
  • 您存储上次插入某些内容的时间并进行检查
  • @pala_thanx ,我知道我在要求语法显然它类似于TIME_TO_SEC(TIMEDIFF(now(), column ))<5)

标签: mysql triggers


【解决方案1】:

这不是一个完美的解决方案,但如果你知道你在做什么,你可以使用这样的东西:

CREATE TRIGGER `status_update`
BEFORE update ON `users`
FOR EACH ROW
  IF (OLD.current_status != NEW.current_status
      AND TIME_TO_SEC(TIMEDIFF(now(), OLD.ts))<5) THEN
      BEGIN
        SET NEW.current_status=OLD.current_status;
        SET NEW.ts=OLD.ts;
      END;
END IF;

(或者您可以像在您的示例中一样使用 SIGNAL 阻止错误更新)。

请看小提琴here。

【讨论】:

  • @max ts 是当前时间戳,您需要以某种方式存储它,但您应该已经拥有它......看看这个页面dev.mysql.com/doc/refman/5.1/en/timestamp-initialization.html这个触发器将允许对其他字段,但不是 current_status 或 ts
  • thanx ,是的,我在发布我的问题并查看小提琴代码后就知道了,我确实删除了它,但显然你还是看到了它!再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多