【问题标题】:How to bulk-amend the job step command in ALL sql server agent jobs如何批量修改所有 sql server 代理作业中的作业步骤命令
【发布时间】:2008-11-18 11:31:05
【问题描述】:

我有许多工作需要将 1 封特定电子邮件发送到人员列表。该收件人列表是硬编码在 step 命令中的,我需要从该列表中删除一个人,在所有工作中。

如何遍历 Sql Server 代理中的所有作业并修改命令文本以查找+替换特定的文本。

我正在使用 sql server 2005 并且已经查看了 sp_update_jobStep 但似乎并不是我想要的。

干杯。

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-server-agent


    【解决方案1】:

    您可以尝试直接更新保存 SQL 服务器作业信息的系统表。与您相关的将是:

    msdb.dbo.SysJobs
    msdb.dbo.SysJobSteps
    

    如果您要删除特定的电子邮件地址,则可以使用单个 UPDATE 语句更新 SysJobSteps 表中的 Command 字段。

    UPDATE SJS SET
        Command = REPLACE(Command, 'EmailAddress&TestDomain.Com', '')
    FROM msdb.dbo.SysJobs SJ
    INNER JOIN msdb.dbo.SysJobSteps SJS
        ON SJS.Job_Id = SJ.Job_Id
    WHERE SJ.Originating_server = ..... -- Your server here
        AND SJS.Command LIKE '%EmailAddress@TestDomain.Com%'
    

    建议首先将上述查询作为 SELECT 语句运行,以测试它仅返回您期望更新的作业步骤。

    【讨论】:

    • 不确定这是否是推荐的方法,但似乎当我这样做时,当我在 GUI 中打开作业时会出现更改,但行从 SysJobSteps 中消失了。奇怪...
    【解决方案2】:

    如果有人还在寻找这个,那么下面应该做。不是最好的代码,但可以完成工作。

    /*
    Replace the below statement with the actual keyword to be replaced:
    INSERT INTO SP_Keyword VALUES
    ('sys.databases3', 'sys.databases5')
    ,('sysjobs3', 'sysjobs5')
    
    Here we are replacing sys.databases3 and sysjobs3 
    with sys.databases5 and sysjobs5 respectively.
    
    Script only searches in 'TSQL', 'Powershell', 'CMDEXEC' job type.
    */
    
    SET NOCOUNT ON
    
    use msdb
    GO
    
    DECLARE @OldV VARCHAR(max) 
    DECLARE @NEWV VARCHAR(max)
    DECLARE @job_id2 varchar(max)
    DECLARE @step_id2 varchar(10)
    DECLARE @command2 varchar(max)
    DECLARE @command3 varchar(300)
    
    --CLEANUP TASKS
    IF EXISTS(SELECT * FROM sys.tables where name = 'SP_Keyword')
        DROP TABLE SP_Keyword
    
    CREATE TABLE SP_Keyword
    (
    old_keyword varchar(200),
    new_keyword varchar(200)
    )
    
    --DEBUG STATEMENT
    --PRINT 'SP_Keyword TABLE CREATED'
    
    INSERT INTO SP_Keyword VALUES
    ('sys.databases3', 'sys.databases5')
    ,('sysjobs3', 'sysjobs5')
    
    --DEBUG STATEMENT
    --PRINT 'VALUES INSERTED FOR KEYWORD'
    
    CREATE TABLE #jobs(
        [name] [sysname] ,
        [step_name] [sysname] ,
        [subsystem] [varchar](40) ,
        [command] [varchar](max) ,
        [keyword] [varchar](200) ,
        [database_name] [sysname] ,
        [enabled] [tinyint] ,
        [description] [varchar](512) ,
        [date_created] [datetime] ,
        [job_id] [uniqueidentifier] ,
        [step_id] [int]     
    )
    
    DECLARE db_cursor3 CURSOR FOR  
    SELECT old_keyword FROM SP_Keyword
        OPEN db_cursor3   
        FETCH NEXT FROM db_cursor3 INTO @OldV
    
        WHILE @@FETCH_STATUS = 0   
        BEGIN   
            INSERT INTO #jobs
            SELECT a.name as job_name, b.step_name, b.subsystem, 
            b.command, @OldV as 'keyword', b.database_name, a.enabled, 
            a.description, a.date_created, b.job_id, b.step_id
            FROM [dbo].[sysjobsteps] as b
            INNER JOIN sysjobs as a
            ON a.job_id = b.job_id
            WHERE [command] LIKE '%'+@OldV+'%'
            AND [subsystem] IN ('TSQL', 'Powershell', 'CMDEXEC')
    
            FETCH NEXT FROM db_cursor3 INTO @OldV
        END   
    
        CLOSE db_cursor3   
        DEALLOCATE db_cursor3
    
    IF NOT EXISTS(SELECT * FROM #jobs)
        BEGIN
        PRINT 'NO JOBS FOUND TO BE REPLACED'
        GOTO SKIPPER
        END
    --SELECT name as job_name, step_name, command, keyword, database_name, enabled, description, date_created FROM #jobs
    
        DECLARE db_cursor3 CURSOR FOR  
        SELECT * FROM SP_Keyword
    
        OPEN db_cursor3   
        FETCH NEXT FROM db_cursor3 INTO @OldV,@newV
    
        WHILE @@FETCH_STATUS = 0   
        BEGIN   
            UPDATE #jobs SET command=REPLACE(command,@oldV,@NewV)
              WHERE command LIKE '%'+@OldV+'%'
               FETCH NEXT FROM db_cursor3 INTO @oldV,@NewV
        END   
    
        CLOSE db_cursor3   
        DEALLOCATE db_cursor3
    
        print 'COMMAND TO REPLACE JOB STEPS IS BEING EXECUTED'
    
        DECLARE db_cursor3 CURSOR FOR  
        SELECT job_id, step_id, command FROM #jobs
    
        OPEN db_cursor3   
        FETCH NEXT FROM db_cursor3 INTO @job_id2,@step_id2, @command2
    
        WHILE @@FETCH_STATUS = 0   
        BEGIN   
            SET @command3 = 'sp_update_jobstep @job_id = '''+@job_id2+''' ,@step_id = '+@step_id2+', @command = '''+@command2+''''
            PRINT @command3
            EXEC(@command3)
            FETCH NEXT FROM db_cursor3 INTO @job_id2,@step_id2, @command2
        END   
    
        CLOSE db_cursor3   
        DEALLOCATE db_cursor3
    
    SKIPPER:
    DROP TABLE #jobs
    DROP TABLE SP_Keyword
    PRINT 'CLEANUP DONE'
    PRINT 'PROGRAM COMPLETE'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多