AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 217009
Accepted
James Jenkins
James Jenkins
Asked: 2018-09-08 04:50:03 +0800 CST2018-09-08 04:50:03 +0800 CST 2018-09-08 04:50:03 +0800 CST

如何使用 T-SQL 停止 SQL Server 代理作业计划程序?

  • 772

我有一项工作,我在协调的时间段内手动启动,做了一堆繁重的工作(主要是恢复备份和为不同的服务器配置)

有几个作业计划以分钟到几天的增量运行。我想“关闭”调度程序,这样在我的手动工作完成之前,什么都不会按计划运行。我意识到,在调度程序重新启动后,错过的作业将在下一个预定时间之前不会再次运行。

  • 第一步:停止调度程序
  • 几个举重的步骤:做艰苦的工作
  • 最后一步:启动调度器

我找到了一个Oracle命令,但我是 100% Microsoft SQL Server

我知道如果我关闭 SQL 代理,作业将不会运行,但这不是我想要的。

今天存在的工作预计下次不会是相同的工作。使用EXEC dbo.sp_update_job禁用作业不是一个可行的解决方案。

附加信息:可能还有一些作业由于某种原因被故意禁用,但确实希望重新启用。停止调度程序似乎是最好的选择。

sql-server sql-server-2014
  • 2 2 个回答
  • 6030 Views

2 个回答

  • Voted
  1. Best Answer
    Shaulinator
    2018-09-08T05:35:10+08:002018-09-08T05:35:10+08:00

    我建议首先创建一个暂存表,该表将为您保存一些信息。该表应构造为保存以下代码输出的数据。我建议至少存储Schedule_ID、name和。job_id(如果你想作弊,你可以展开星号并选择你想要的列,然后INTO在database.schema.table_name_you_want_to_create中添加单词,它会第一次为你创建表。之后你可以更改将其放入插入中。)

    SELECT * FROM 
    MSDB.dbo.sysschedules ss
    INNER JOIN msdb.dbo.sysjobschedules jss
       ON jss.schedule_id = ss.schedule_id
    WHERE ss.enabled = 1
    

    该代码返回所有计划的计划,并且它还执行内部连接以将返回的数据限制为仅与当前启用的作业配对的计划。

    然后,您可以创建一个循环或游标或类似于循环临时表并执行sp_update_schedule 过程的东西。这将禁用所有已启用并与作业配对的计划。维护完成后,您可以再次运行循环,但这一次启用您之前禁用的计划。

    如果您想要一个循环的示例,您可以查看我过去在 stack overflow 上创建的示例。

    我已经回去并使用这些建议来创建完整的代码解决方案。请看下面,总共有两个脚本。第一个将禁用您的作业,第二个将重新启用它们。在将其投入生产之前,在测试环境中进行测试。 完整性的来源。

    脚本一:

    USE MSDB;
    
    /*************************************************************
     Checking for history table. Creating it if it doesn't exist. 
    *************************************************************/
    
    IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NULL
    BEGIN
    CREATE TABLE [dbo].[JobsEnabledTracker](
    [Id] [INT] IDENTITY(1, 1) NOT NULL, 
    [job_id]      [UNIQUEIDENTIFIER] NULL, 
    [schedule_id] [BIGINT] NULL, 
    [enabled]     [BIT] NULL);
    END;
    IF EXISTS
    (
        SELECT 
               1
        FROM [dbo].[JobsEnabledTracker]
        WHERE [enabled] = 1
    )
       OR
    (
        SELECT 
               COUNT(*)
        FROM [dbo].[JobsEnabledTracker]
    ) = 0
        BEGIN
            PRINT 'There are jobs enabled or there are no jobs yet populated in the history table.';
    
    /***********************
     Clear out history table
    ***********************/
    
            PRINT 'Truncating history table: dbo.JobsEnabledTracker';
            TRUNCATE TABLE [dbo].[JobsEnabledTracker];
    
            PRINT 'Inserting records into history table: dbo.JobsEnabledTracker';
    
    /******************************
     Add in values to history table
    ******************************/
    
            INSERT INTO [dbo].[JobsEnabledTracker]
            (
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            )
            SELECT 
                   [jss].[job_id], 
                   [jss].[schedule_id], 
                   1 AS 'enabled'
            FROM [msdb].[dbo].[sysschedules] AS [ss]
                 INNER JOIN [msdb].[dbo].[sysjobschedules] AS [jss] ON [jss].[schedule_id] = [ss].[schedule_id]
            WHERE [ss].[enabled] = 1;
    
    /**********************************************************************************
     Table variable to hold schedules and jobs enabled. This is important for the loop.
    **********************************************************************************/
    
            DECLARE @JobsEnabled TABLE
            ([Id]          INT
             PRIMARY KEY IDENTITY(1, 1), 
             [job_id]      UNIQUEIDENTIFIER, 
             [schedule_id] BIGINT, 
             [enabled]     BIT
            );
    
    /*****************************************
     Insert schedules that we need to disable.
    *****************************************/
    
            INSERT INTO @JobsEnabled
            (
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            )
            SELECT 
                   [job_id], 
                   [schedule_id], 
                   [enabled]
            FROM [dbo].[JobsEnabledTracker];
    
    /********************************
     Holds the job id and schedule id
    ********************************/
    
            DECLARE @jobid UNIQUEIDENTIFIER;
            DECLARE @scheduleid BIGINT;
    
    /***********************************
     Holds the ID of the row in the loop
    ***********************************/
    
            DECLARE @ID INT= 0;
    
    /**********************
     Check if records exist
    **********************/
    
            IF EXISTS
            (
                SELECT 
                       [Id]
                FROM @JobsEnabled
            )
                BEGIN
                    PRINT 'Loop mode, jobs found enabled.';
    
    /**********
     Begin loop
    **********/
    
                    WHILE(1 = 1)
                        BEGIN
    
    /***************************************
     Grab jobid, scheduleid, and id of rows.
    ***************************************/
    
                            SELECT 
                                   @jobid =
                            (
                                SELECT TOP 1 
                                       [job_id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
                            SELECT 
                                   @scheduleid =
                            (
                                SELECT TOP 1 
                                       [schedule_id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
                            SELECT 
                                   @ID =
                            (
                                SELECT TOP 1 
                                       [Id]
                                FROM @JobsEnabled
                                ORDER BY 
                                         [job_id]
                            );
    
    /************************************
     Re-enable schedule associated to job
    ************************************/
    
                            PRINT 'Disabling schedule_id: '+CAST(@scheduleid AS VARCHAR(255))+' paired to job_id: '+CAST(@jobid AS VARCHAR(255));
                            EXEC [sp_update_schedule] 
                                 @schedule_id = @scheduleid, 
                                 @enabled = 0;
    
    /*********************
     Removes row from loop
    *********************/
    
                            DELETE FROM @JobsEnabled
                            WHERE 
                                  [Id] = @ID;
    
                            UPDATE [dbo].[JobsEnabledTracker]
                              SET 
                                  [enabled] = 0
                            WHERE 
                                  [job_id] = @jobid
                                  AND [schedule_id] = @scheduleid;
    
    /****************************
     No more rows, stops deleting
    ****************************/
    
                            IF
                            (
                                SELECT 
                                       COUNT(*)
                                FROM @JobsEnabled
                            ) <= 0
                                BEGIN
                                    BREAK
                                END;
    
    /********
     End Loop
    ********/
                        END;
                    PRINT 'Exiting loop, disabling schedules paired to jobs complete.';
    
    /**********
     End elseif
    **********/
                END;
                ELSE
                BEGIN
                    PRINT 'All done';
                END;
        END;
        ELSE
        BEGIN
            PRINT 'YOU HAVE JOBS STILL DISABLED, EXITING SCRIPT. PLEASE RUN SCRIPT TWO FIRST.';
        END;
    

    脚本二

    USE MSDB;
    
    /*******************************************************************************
     Check for history table. This physical table tells us what jobs we are going to
     enable the scheduler for.
    *******************************************************************************/
    
    IF OBJECT_ID('dbo.JobsEnabledTracker', 'U') IS NOT NULL
    BEGIN
        IF EXISTS
        (
            SELECT 1
            FROM [dbo].[JobsEnabledTracker]
            WHERE [enabled] = 0
        )
        BEGIN
            PRINT 'Jobs disabled in history table: dbo.JobsEnabledTracker found.';
    
    /**********************************************************************************
     Table variable to hold schedules and jobs enabled. This is important for the loop.
    **********************************************************************************/
    
            DECLARE @JobsEnabled TABLE
            ( 
            [Id] int PRIMARY KEY IDENTITY(1, 1)
            , [job_id] uniqueidentifier
            , [schedule_id] bigint
            , [enabled] bit
            );
    
    /*******************************************************************************
     Insert schedules that we had disabled that we need to go back in and re-enable.
    *******************************************************************************/
    
            INSERT INTO @JobsEnabled( [job_id], [schedule_id], [enabled] )
                   SELECT [job_id], [schedule_id], [enabled]
                   FROM [dbo].[JobsEnabledTracker];
    
    /********************************
     Holds the job id and schedule id
    ********************************/
    
            DECLARE @jobid uniqueidentifier;
            DECLARE @scheduleid bigint;
    
    /***********************************
     Holds the ID of the row in the loop
    ***********************************/
    
            DECLARE @ID int= 0;
    
    /**********************
     Check if records exist
    **********************/
    
            IF EXISTS
            (
                SELECT [Id]
                FROM @JobsEnabled
            )
            BEGIN
                PRINT 'Loop mode, jobs found disabled.';
    
    /**********
     Begin loop
    **********/
    
                WHILE 1 = 1
                BEGIN
    
    /***************************************
     Grab jobid, scheduleid, and id of rows.
    ***************************************/
    
                    SELECT @jobid =
                    (
                        SELECT TOP 1 [job_id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
                    SELECT @scheduleid =
                    (
                        SELECT TOP 1 [schedule_id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
                    SELECT @ID =
                    (
                        SELECT TOP 1 [Id]
                        FROM @JobsEnabled
                        ORDER BY [job_id]
                    );
    
    /***************************************
     Re-enable schedule associated to job           
    ***************************************/
    
                    PRINT 'Enabling schedule_id: '+CAST(@scheduleid AS varchar(255))+' paired to job_id: '+CAST(@jobid AS varchar(255));
                    EXEC [sp_update_schedule] @schedule_id = @scheduleid, @enabled = 1;
    
    /*********************
     Removes row from loop
    *********************/
    
                    DELETE FROM @JobsEnabled
                    WHERE [Id] = @ID;
    
    /***********************
     Set job back to enabled
    ***********************/
    
                    UPDATE [dbo].[JobsEnabledTracker]
                      SET [enabled] = 1
                    WHERE [job_id] = @jobid AND 
                          [schedule_id] = @scheduleid;
    
    /****************************
     No more rows, stops deleting
    ****************************/
    
                    IF
                    (
                        SELECT COUNT(*)
                        FROM @JobsEnabled
                    ) <= 0
                    BEGIN
                        BREAK;
                    END;
    
    /********
     End Loop
    ********/
                END;
                PRINT 'Exiting loop, enabling schedules paired to jobs complete.';
    
    /**********
     End elseif
    **********/
            END;
            ELSE
            BEGIN
                PRINT 'All done';
            END;
        END;
        ELSE
        BEGIN
            PRINT 'dbo.JobsEnabledTracker has no disabled jobs currently.';
        END;
    END;
    ELSE
    BEGIN
        PRINT 'dbo.JobsEnabledTracker is NULL, you may need to run the first script to create and populate this table.';
    END;
    
    • 4
  2. starko
    2018-09-08T05:22:27+08:002018-09-08T05:22:27+08:00

    sp_stop_job?

    文档链接:https ://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-stop-job-transact-sql?view=sql-server-2017

    • -2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve