我正在尝试创建一个有延迟的SQL脚本。
我可以使用:
blah blah
WAITFOR DELAY '00:30:00'
blah blah
但是使用这样的脚本要求我坐30分钟。
离开网站将取消脚本。
问题是我想要更改表中的某些内容,然后在30分钟后自动将其更改回来。
进行更改的人将离开网页,因此任何类型的客户端脚本都是不可能的。
如果30分钟过后,我也不能等待此人返回并进行更改,无论如何,更改必须在30分钟后发生。
如果没有在服务器上提供服务或任何其他程序,有没有这样做?
仅使用ASP / SQL编程。
如果无法做到这一点,如何在服务器上进行服务或程序进行此更改?
必须能够使用ASP从网站开始。
答案 0 :(得分: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);
答案 1 :(得分:1)
就个人而言,虽然这个委员会的其他人永远不会认为它是专业的...我使用网站正常运行时间监控服务来运行脚本。例如,每隔30分钟http://www.serviceuptime.com/free_monitoring.php就会出现一个你选择的asp页面。
为了便于开发,我使用不同的监视服务来加载脚本。有更多专业的方法,例如制作VBS脚本并通过任务管理器运行它,我为长时间运行的脚本执行操作,但对于像往常一样检查邮件队列这样的简单事情,我只是使用监控服务来加载页面经常足以做我想做的事。
答案 2 :(得分: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
通过这样做,我不需要任何程序。
顺便说一句:这项工作每隔几秒就会运行一次。