0

我正在尝试创建一个延迟的 SQL 脚本。

我可以使用:

blah blah
WAITFOR DELAY '00:30:00'
blah blah

但是使用这样的脚本需要我坐 30 分钟。

离开网站将取消脚本。


问题是我想更改表格中的某些内容,然后在 30 分钟后自动更改回来。

进行更改的人将离开网页,因此任何类型的客户端脚本都是不可能的。

如果 30 分钟过去了,我也不能等待该人返回并进行更改,无论如何更改必须在 30 分钟后发生。


有没有在服务器上不提供服务或任何其他程序的情况下做到这一点?

仅使用 ASP/SQL 编程。

如果这是不可能的,我如何在服务器上创建一个服务程序来进行这个更改?

必须能够从使用 ASP 的网站开始。

4

3 回答 3

2

我个人不会以这种方式处理这种情况。我不确切知道您的数据结构是什么,或者为什么您需要在 30 分钟内更改某些内容,但我会使用“更改”表。

所以你可能有类似的东西

MainTable(ID、Column1、Column2、Column3、Column4);

ChangeTable(ID、Column1、Column2、Column3、Column4、CreatedDateTime);

每当您进行更改而不是更新主表时,您只需将要更新的值插入到 ChangeTable 中(我假设 SQL-Server 基于WAITFOR)。

然后我会做出这样的看法:

CREATE VIEW dbo.MainView
AS
SELECT  m.ID,
        Column1 = ISNULL(c.Column1, m.Column1),
        Column2 = ISNULL(c.Column2, m.Column2),
        Column3 = ISNULL(c.Column3, m.Column3)
FROM    dbo.MainTable m
        OUTER APPLY 
        (   SELECT  TOP 1 c.Column1, c.Column2, c.Column3
            FROM    dbo.ChangeTable c
            WHERE   c.ID = m.ID
            AND     c.CreatedDate >= DATEADD(MINUTE, -30, GETDATE())
            ORDER BY c.CreatedDate DESC
        ) c;

然后在整个网站上参考这个。

如果空间是一个问题,您可以设置一个夜间作业来删除任何旧条目,例如将以下设置为在 00:30 运行

DELETE  ChangeTable
WHERE   CreatedDate < CAST(GETDATE() AS DATE);
于 2013-09-02T12:18:27.620 回答
1

就个人而言,虽然这个板上的其他人永远不会认为它是专业的......我使用网站正常运行时间监控服务来运行脚本。例如,这将每 30 分钟点击一次您选择的 asp 页面http://www.serviceuptime.com/free_monitoring.php

为了便于开发,我使用不同的监控服务来加载脚本。这样做有更专业的方法,例如制作 VBS 脚本并通过任务管理器运行它,我为长时间运行的脚本执行此操作,但对于像每隔一段时间检查邮件队列这样简单的事情,我只使用监控服务来加载页面经常做我想做的事。

于 2013-09-02T20:24:02.803 回答
0

通过使用SQL Server 代理SQL 过程解决了这个问题。

这基本上是我的代码现在是如何构建的:

在表中进行临时更改

UPDATE table SET column = 'temp_value' WHERE column = 'normal_value'

检查程序是否存在,如果存在,则将其删除。创建一个过程以还原表中的更改。

IF EXISTS ( SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'myRevertProcedure')
        AND type IN ( N'P', N'PC' ) )
    DROP PROCEDURE myRevertProcedure 

CREATE PROCEDURE myRevertProcedure 
    AS
    BEGIN 
        WAITFOR DELAY '00:30:00'
        UPDATE table SET column = 'normal_value' WHERE column = 'temp_value'
    END

我在 SQL Server 代理中创建了一个作业,该作业运行以下内容:

IF EXISTS ( SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'myRevertProcedure')
        AND type IN ( N'P', N'PC' ) )
    BEGIN
        EXEC MyProc
        DROP PROCEDURE myRevertProcedure 
    END

作业不简单地还原更改本身的原因是因为用户应设置延迟。

如果延迟总是 30 分钟,我可以让作业按以下方式运行:

IF EXISTS (SELECT * FROM table WHERE column = 'temp_value')
    BEGIN
        WAITFOR DELAY '00:30:00'
        UPDATE table SET column = 'normal_value' WHERE column = 'temp_value'
    END

通过这样做,我不需要任何程序。

顺便说一句:该作业每隔几秒钟运行一次。

于 2013-09-03T13:58:53.843 回答