2016-07-29 71 views
0
CREATE TABLE Appointment 
(
    Id     INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Maker    INT NOT NULL, 
    Target    INT NOT NULL, 
    [From]    DateTime NOT NULL, 
    [To]    DateTime NOT NULL, 
    Note    NVARCHAR(128) NOT NULL, 
    Created    FLOAT NOT NULL, 
    LastModified  FLOAT, 
    LastModifiedNote NVARCHAR(128), 
    [Status]   TINYINT NOT NULL 

    FOREIGN KEY (Maker) REFERENCES Person(Id), 
    FOREIGN KEY (Target) REFERENCES Person(Id) 
) 

让我解释一下我的表中的一些信息:该表是关于人与人之间的约会信息。 [From]是什么时候应该开始约会,[To]是约会应该结束的时间。从当前时间起在特定时间触发SQL命令

所有我想要做的是:

  • 在创建约会,检查时间[To],当时任命应该结束,查询运行改变[Status]4(已过期)

  • 当预约编辑,检查时间[To],做同样的事情上面

步骤

例如:

  • 9.am,我创建约见[到]2016年7月29日下午5:00,所以在下午5:00,查询应该运行到这一任命的改变[状态]到

  • 上午10点,我编辑的这一任命,我改变[转]2016年7月29日下午7:00,而不是任命改变了这种状况在下午5时,现在则是在改变其状态7:00 pm

我想我应该使用触发器和事件,但我不知道如何实现我的目标。

任何人都可以帮助我吗?

谢谢。

+0

如何使用其他状态?如果它的值始终可以从其他数据中确定,那么您可能需要考虑根本不存储它 - 或将其作为计算列。 –

+0

[状态]用于显示约会是活动还是过期。 1:有效,4已过期。 – Redplane

+0

你应该在插入和更新时创建触发器 –

回答

0

您可以使用触发器,但这不会解决您的问题。你想要的是一些将在后台运行的东西,并在到期时将过期约会的状态更改为4。

有不同的方法来实现这一点。一种非常简单的方法是创建一个定期执行的SQL Server作业代理作业,例如每5分钟甚至1分钟执行一次。

在SQL Server Management Studio中找到您的服务器,最后您应该看到SQL Server工作代理。展开它并在作业下创建一个新作业。里面的代码就像这样。

UPDATE A 
SET A.Status=4 
FROM Appointment A 
WHERE A.Status<>4 AND CURRENT_TIMESTAMP>A.[To] 

我希望这会有所帮助。

+0

嗯..如果查询每分钟运行5分钟,我认为它会导致服务器超载。 – Redplane

+0

@Redplane:在Status和To date上有一个适当的索引,更新会很快。调度它将使它更新在一段时间内发生更改的所有行,因此它将减少服务器的重载,然后逐个更新。 –

+0

我已阅读过关于SQL Job的内容,它不符合我的实际需要,但速度如您所说,我认为我应该使用SQL Job。谢谢您的回答 :) – Redplane

相关问题