我看了一眼,但找不到足够具体的东西来回答,所以想问这个问题。
第一,这是否可能呢?
第二,我的搜索不符合标准吗?这个问题已经得到了回答--如果是,在哪里?
最后,是否有其他更好的路线呢?
好的,我的场景是使用SQL Server,我有一个按计划运行的SQL作业--我想删除这个计划,并说“当这个任务完成后,再运行一次”,但是我不想使用最后一步= goto步骤1,我想做的事情如下.
创建一个带有PK和其他列的表以帮助控制。让我们说
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
INSERT INTO dbo.MyTable ('RUN',GETUTCDATE(),0)触发器运行和执行MSSQLJOB
INSERT INTO dbo.MyTable ('STOP',GETUTCDATE(),60)触发器运行并等待持续时间(以分钟为单位)。
~ 60分钟后,触发器再次运行并执行MSSQL作业。
这就让我想到了为什么,我有一个工作是按照上面提到的计划运行的;这个任务不需要很长时间就可以运行,也不是很重要(我们的主要数据仓库:D -我是BI开发人员。)但是当它构建的时候,我想一次又一次地通过设计来构建它,它是快速的,但是我也希望能够有“预定的停机时间”,而不必去禁用作业本身,或者确保在它正在使用或正在运行的表中所有的东西都是正常的。我希望作业在当前运行完成一段时间后,在完成当前构建运行之后停止运行--构建的最后一步将被插入到带有触发器的表中。
因此,目标是插入一行“停止20分钟”,然后对其进行更改,然后忘记它,因为作业将再次运行,MSSQL作业将继续运行。
我目前还没有一个确切的测试环境,而且我总是用更改的定义来了解自己,因为我在它实际运行时更改了它--理想情况下,我希望自动暂停构建一段时间,如果这样做有意义的话,我只想在表中插入一行?
理论上,我相信这是可能的。但在MSSQL持续集成、简化部署等方面,我不知道这是一个好主意还是一个可行的想法。
和帮助感激。
谢谢理查德。
Ps.mvc的-the原因,所以我可以添加到MVC应用程序中,只需一次单击就可以将通信发送给部署的涉众,详细信息,插入停止持续时间所需的行,然后执行我的部署,而不需要做很多事情--如果我可以创建这样的某种形式的触发器,我可以自动完成所有这些操作。
发布于 2018-08-13 15:22:13
这当然是一种创造性的方法,但我不知道有什么方法可以告诉SQL Server,“从现在开始,等X分钟,然后再做Y”。
如果我是您,我会研究一种方法,包括安排作业每分钟运行(或您想要的精度级别),然后使用您的元表来告诉作业是否可以做某事。
发布于 2018-08-13 16:50:43
好的,我已经做了一些测试,没有时间去研究这个问题,但是我成功地完成了我想要的工作--尽管它并不理想,我个人认为它不应该被使用,只是为了让任何人都能找到和使用它,如果它有用途的话。
它要求您有两个作业和两个表来控制这些。主作业和主作业调用的备用作业。然后是带有触发器的主表,以及控制插入内容的表
我更喜欢所有其他的答案,因为我的Q的最初部分是有一个更好的方法来做到这一点,是的,有。不过,做测试很有趣!
这个想法是第二个表,它控制插入的内容,它只使用最近的行作为它将要做的“按日期排列的顶级1订单DESC”的操作,因此这个表可能会变得臃肿,但这仍然是一个工作模型--您需要烫手才能创建2个表和2个就业机会,并需要一个触发器进行测试。代码如下
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发布于 2018-08-13 15:41:49
我推荐这样的东西:
RUN,则继续作业,否则退出作业STOP后将一个新行添加到表中新的第一步可能是这样的:
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)如果失败,请将此步骤设置为完成作业报告成功。在成功的时候,继续第二步。
新的最后一步将是简单的插入:
INSERT INTO yourTable (Col2_Desc, timestamp) --whatever else
SELECT 'STOP', GETDATE()这样,当您希望作业运行时,只需使用RUN将一行插入到表中。您还可以通过查看STOP行来记录作业实际完成的时间。
https://stackoverflow.com/questions/51825065
复制相似问题