gpt4 book ai didi

sql-server - 在时间延迟后从触发器执行存储过程

转载 作者:行者123 更新时间:2023-12-03 13:55:52 25 4
gpt4 key购买 nike

我想从触发器调用存储过程,
如何在 x 分钟后执行该存储过程?
我要找的不是 WAITFOR DELAY
谢谢

最佳答案

有一个定期运行并从表中提取存储过程参数的 SQL 代理作业 - 行还应指示何时应该运行存储过程,因此 SQL 代理作业只会选择到期/稍微过期的行。它应该在调用存储过程后删除行或标记它们。

然后,在触发器中,只需在同一个表中插入一个新行。

您不希望在触发器中放置任何会以任何方式影响原始事务执行的内容 - 您绝对不希望造成任何延迟,或与同一数据库之外的任何内容进行交互。

例如,如果存储过程是

CREATE PROCEDURE DoMagic
@Name varchar(20),
@Thing int
AS
...

然后我们创建一个表:
CREATE TABLE MagicDue (
MagicID int IDENTITY(1,1) not null, --May not be needed if other columns uniquely identify
Name varchar(20) not null,
Thing int not null,
DoMagicAt datetime not null
)

SQL 代理工作将执行以下操作:
WHILE EXISTS(SELECT * from MagicDue where DoMagicAt < CURRENT_TIMESTAMP)
BEGIN
DECLARE @Name varchar(20)
DECLARE @Thing int
DECLARE @MagicID int

SELECT TOP 1 @Name = Name,@Thing = Thing,@MagicID = MagicID from MagicDue where DoMagicAt < CURRENT_TIMESTAMP

EXEC DoMagic @Name,@Thing

DELETE FROM MagicDue where MagicID = @MagicID
END

触发器将只有:
CREATE TRIGGER Xyz ON TabY after insert
AS
/*Do stuff, maybe calculate some values, or just a direct insert?*/
insert into MagicDue (Name,Thing,DoMagicAt)
select YName,YThing+1,DATEADD(minute,30,CURRENT_TIMESTAMP) from inserted

如果您在不支持代理的版本中运行,那么您可能必须伪造它。我过去所做的是创建一个包含“穷人代理工作”的存储过程,例如:
CREATE PROCEDURE DoBackgroundTask
AS

WHILE 1=1
BEGIN
/* Add whatever SQL you would have put in an agent job here */

WAITFOR DELAY '00:05:00'
END

然后,创建第二个存储过程,这次是在 master 中。数据库,等待 30 秒,然后调用第一个过程:
CREATE PROCEDURE BootstrapBackgroundTask
AS
WAITFOR DELAY '00:00:30'
EXEC YourDB..DoBackgroundTask

然后,将此过程标记为启动过程,使用 sp_procoption :
EXEC sp_procoption N'BootstrapBackgroundTask', 'startup', 'on'

并重新启动服务 - 您现在将拥有一个持续运行的查询。

关于sql-server - 在时间延迟后从触发器执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11240247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com