防止列的快速更新
Pervent rapid update of a column
假设我有一个关于我的用户 table 的专栏,名为 current_status
我希望该列的更新间隔至少 5 秒
换句话说,如果代码的一部分应该更新此列,则在此之后的 5 秒内,其他代码应该无法更改它。
我知道 100 种在代码上做的方法,但我想在数据库级别做,主要是因为它是一个大网站,原始程序员不可用!
我在考虑某种触发器或随时间变化的东西?
在这里,现在我该如何应用 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 ;
我已 table 调用 status_changes
来跟踪这些更改,每次状态更改时我都会向此 table 添加一行
status_changes : id
, user_id
, timestamp
, current_status
这不是一个完美的解决方案,但如果您知道自己在做什么,则可以使用类似这样的方法:
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 阻止错误更新)。
请看一个fiddle here.
假设我有一个关于我的用户 table 的专栏,名为 current_status
我希望该列的更新间隔至少 5 秒
换句话说,如果代码的一部分应该更新此列,则在此之后的 5 秒内,其他代码应该无法更改它。
我知道 100 种在代码上做的方法,但我想在数据库级别做,主要是因为它是一个大网站,原始程序员不可用!
我在考虑某种触发器或随时间变化的东西? 在这里,现在我该如何应用 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 ;
我已 table 调用 status_changes
来跟踪这些更改,每次状态更改时我都会向此 table 添加一行
status_changes : id
, user_id
, timestamp
, current_status
这不是一个完美的解决方案,但如果您知道自己在做什么,则可以使用类似这样的方法:
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 阻止错误更新)。
请看一个fiddle here.