首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server触发-is这种可能的正确用法

Server触发-is这种可能的正确用法
EN

Stack Overflow用户
提问于 2018-08-13 14:48:49
回答 3查看 53关注 0票数 1

我看了一眼,但找不到足够具体的东西来回答,所以想问这个问题。

第一,这是否可能呢?

第二,我的搜索不符合标准吗?这个问题已经得到了回答--如果是,在哪里?

最后,是否有其他更好的路线呢?

好的,我的场景是使用SQL Server,我有一个按计划运行的SQL作业--我想删除这个计划,并说“当这个任务完成后,再运行一次”,但是我不想使用最后一步= goto步骤1,我想做的事情如下.

创建一个带有PK和其他列的表以帮助控制。让我们说

代码语言:javascript
复制
CREATE TABLE dbo.MyTable 
(Col1_ID INT Primary Key
, Col2_Desc VARCHAR(256),
 Col3_DT SmallDatetime default getutcdate()
,Col4_Duration INT default 60)

然后向该表中添加一个触发器,以便当在此表上执行INSERT时,触发器运行,如果它是一个描述为(Col2_Desc) "Run“或类似的insert,则执行作业"MSSQL作业名称”。

如果我们随后作为Col2_Desc添加了一个"STOP“,那么无论Col4_Duration作业声明多少分钟,触发器都不会运行MSSQLJOB。

I.E

代码语言:javascript
复制
 INSERT INTO dbo.MyTable ('RUN',GETUTCDATE(),0)

触发器运行和执行MSSQLJOB

代码语言:javascript
复制
INSERT INTO dbo.MyTable ('STOP',GETUTCDATE(),60)

触发器运行并等待持续时间(以分钟为单位)。

~ 60分钟后,触发器再次运行并执行MSSQL作业。

这就让我想到了为什么,我有一个工作是按照上面提到的计划运行的;这个任务不需要很长时间就可以运行,也不是很重要(我们的主要数据仓库:D -我是BI开发人员。)但是当它构建的时候,我想一次又一次地通过设计来构建它,它是快速的,但是我也希望能够有“预定的停机时间”,而不必去禁用作业本身,或者确保在它正在使用或正在运行的表中所有的东西都是正常的。我希望作业在当前运行完成一段时间后,在完成当前构建运行之后停止运行--构建的最后一步将被插入到带有触发器的表中。

因此,目标是插入一行“停止20分钟”,然后对其进行更改,然后忘记它,因为作业将再次运行,MSSQL作业将继续运行。

我目前还没有一个确切的测试环境,而且我总是用更改的定义来了解自己,因为我在它实际运行时更改了它--理想情况下,我希望自动暂停构建一段时间,如果这样做有意义的话,我只想在表中插入一行?

理论上,我相信这是可能的。但在MSSQL持续集成、简化部署等方面,我不知道这是一个好主意还是一个可行的想法。

和帮助感激。

谢谢理查德。

Ps.mvc的-the原因,所以我可以添加到MVC应用程序中,只需一次单击就可以将通信发送给部署的涉众,详细信息,插入停止持续时间所需的行,然后执行我的部署,而不需要做很多事情--如果我可以创建这样的某种形式的触发器,我可以自动完成所有这些操作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-13 15:22:13

这当然是一种创造性的方法,但我不知道有什么方法可以告诉SQL Server,“从现在开始,等X分钟,然后再做Y”。

如果我是您,我会研究一种方法,包括安排作业每分钟运行(或您想要的精度级别),然后使用您的元表来告诉作业是否可以做某事。

票数 2
EN

Stack Overflow用户

发布于 2018-08-13 16:50:43

好的,我已经做了一些测试,没有时间去研究这个问题,但是我成功地完成了我想要的工作--尽管它并不理想,我个人认为它不应该被使用,只是为了让任何人都能找到和使用它,如果它有用途的话。

它要求您有两个作业和两个表来控制这些。主作业和主作业调用的备用作业。然后是带有触发器的主表,以及控制插入内容的表

我更喜欢所有其他的答案,因为我的Q的最初部分是有一个更好的方法来做到这一点,是的,有。不过,做测试很有趣!

这个想法是第二个表,它控制插入的内容,它只使用最近的行作为它将要做的“按日期排列的顶级1订单DESC”的操作,因此这个表可能会变得臃肿,但这仍然是一个工作模型--您需要烫手才能创建2个表和2个就业机会,并需要一个触发器进行测试。代码如下

代码语言:javascript
复制
CREATE TABLE dbo.MyTestTable
    (
        My_PK INT Primary Key IDENTITY(1,1)
        ,My_Action VARCHAR(256)
        ,My_DateTime SMALLDATETIME
        ,My_Duration_To_Wait INT
    )

GO

    CREATE OR ALTER TRIGGER RunMyJob  
ON dbo.MyTestTable 
AFTER INSERT   
AS  
IF EXISTS(SELECT * FROM INSERTED WHERE My_Action = 'RUN')
BEGIN
    EXEC msdb.dbo.sp_start_job 'TESTJOB'
END

DECLARE @MyInt INT = (SELECT top 1 My_Duration_To_Wait FROM dbo.MyTestTableAction ORDER BY My_DateTime DESC)
DECLARE @WaitTime VARCHAR(256) = DATEADD(Minute,@MyInt,GETUTCDATE())
DECLARE @MyDelay VARCHAR(8) =  CONVERT(TIME, @WaitTime-GETUTCDATE())


IF EXISTS(SELECT * FROM INSERTED WHERE My_Action = 'STOP')
BEGIN
    PRINT 'WAITING FOR ' + CAST(@WaitTime AS VARCHAR(30)) + ' '
    WAITFOR DELAY @MyDelay
    PRINT 'Running again ' + CAST(GETUTCDATE() AS VARCHAR(256))
    EXEC msdb.dbo.sp_start_job 'TESTJOB'
END
GO   


JOB_NAME = 'TESTJOB'
JOB STEP 1 = SELECT 1
JOB STEP 2 = EXEC msdb.dbo.sp_start_job 'TESTJOBINSERT'

JOB_NAME = 'TESTJOBINSERT'
JOB STEP 1 = 
INSERT INTO dbo.MyTestTable
SELECT TOP 1 My_Action, GETUTCDATE(), My_Duration_To_Wait FROM dbo.MyTestTableAction ORDER BY My_DateTime DESC


CREATE TABLE dbo.MyTestTableAction
    (
        My_Action VARCHAR(256)
        ,My_Duration_To_Wait INT
        ,My_DateTime DATETIME
    )
INSERT INTO dbo.MyTestTableAction VALUES ('RUN',0,GETUTCDATE()) -- just run as normal


INSERT INTO dbo.MyTestTableAction VALUES ('STOP',10,GETUTCDATE()) -- Wait 10 minutes before starting again
票数 1
EN

Stack Overflow用户

发布于 2018-08-13 15:41:49

我推荐这样的东西:

  1. 将作业设置为每30分钟运行一次(或任意时间)
  2. 向检查表的作业添加新的第一步;如果表中的最新记录为RUN,则继续作业,否则退出作业
  3. 在作业结束时添加一个步骤,在完成STOP后将一个新行添加到表中

新的第一步可能是这样的:

代码语言:javascript
复制
DECLARE @isRun varchar(4) = (SELECT TOP 1 Col2_Desc 
                             FROM yourTable 
                             ORDER BY Col1_ID DESC)

IF @isRun = 'RUN'
BEGIN
SELECT 'Good'
ELSE RAISERROR ('Not time to run', 16, 1)

如果失败,请将此步骤设置为完成作业报告成功。在成功的时候,继续第二步。

新的最后一步将是简单的插入:

代码语言:javascript
复制
INSERT INTO yourTable (Col2_Desc, timestamp) --whatever else
SELECT 'STOP', GETDATE()

这样,当您希望作业运行时,只需使用RUN将一行插入到表中。您还可以通过查看STOP行来记录作业实际完成的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51825065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档