2008-11-18 63 views
5

我有很多作業都有一個步驟可以將1條特定電子郵件發送到人員列表。該列表中的reciepients在步驟命令中進行了硬編碼,我需要從所有列表中刪除一個人。如何批量修改所有sql服務器代理作業中的作業步驟命令

如何遍歷Sql Server Agent中的所有作業,並修改命令文本以查找+替換特定的文本。

我正在使用sql server 2005並已經看過sp_update_jobStep但看起來並不是我想要的。

乾杯。

回答

5

您可以嘗試直接更新保存SQL Server作業信息的系統表。相關藥粥你會:

msdb.dbo.SysJobs 
msdb.dbo.SysJobSteps 

如果你有一個特定的電子郵件地址刪除,你可以在SysJobSteps表一個UPDATE語句中更新命令場。

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 '%[email protected]%' 

建議首先將上述查詢作爲SELECT語句運行,以測試它只返回您期望更新的作業步驟。

0

如果有人仍然在尋找這個下面應該做的。不是最好的代碼,但完成了工作。

/* 
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 '%'[email protected]+'%' 
     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 '%'[email protected]+'%' 
      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 = '''[email protected]_id2+''' ,@step_id = '[email protected]_id2+', @command = '''[email protected]+'''' 
     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'