我有一个电子商务应用程序。我有一个Item实体,并且只要该项目的结束日期时间等于当前时间,该项目的状态就应该改变(我还需要执行其他SQL操作,例如在表中插入一行)
基本上,我想执行一个SQL操作,该操作每分钟检查一次数据库并更改实体。
我对如何实现这一点有一些想法:
我对此很陌生,所以我不知道如何实现它。考虑到可伸缩性性能的最有效的实现是什么?
其他信息:数据库是SQL Server,服务器是Linux,后端是Java Spring Boot。
答案 0 :(得分:1)
如果您需要在插入或更新之后运行脚本,则可以在触发器中整合所有复杂的逻辑(例如,在其他表中插入行,更新状态列等):
这是一个示例表架构:
CREATE TABLE t1 (id INT IDENTITY(1,1), start_time DATETIME, end_time DATETIME,
status VARCHAR(25))
以及该表的示例插入/更新触发器:
CREATE TRIGGER u_t1
ON t1
AFTER INSERT,UPDATE
AS
BEGIN
UPDATE t1
SET status = CASE WHEN inserted.end_time = inserted.start_time
THEN 'same' ELSE 'different' END
FROM t1
INNER JOIN inserted ON t1.id = inserted.id
-- do anything else you want!
-- e.g.
-- INSERT INTO t2 (id, status) SELECT id, status FROM inserted
END
GO
插入一些测试记录:
INSERT INTO t1 (start_time, end_time)
VALUES
(GETDATE(), GETDATE() - 1), -- different
(GETDATE(), GETDATE()) -- same
在插入后查询表:
SELECT * FROM t1
请确保状态计算正确:
id start_time end_time status
1 2018-07-17 02:53:24.577 2018-07-16 02:53:24.577 different
2 2018-07-17 02:53:24.577 2018-07-17 02:53:24.577 same
如果您的唯一目标是根据表中的其他值更新状态列,那么计算列是最简单的方法;您只需提供公式即可:
create table t1 (id int identity(1,1), start_time datetime, end_time datetime,
status as
case
when start_time is null then 'start null'
when end_time is null then 'end null'
when start_time < end_time then 'start less'
when end_time < start_time then 'end less'
when start_time = end_time then 'same'
else 'what?'
end
)