SqlServer代理作業


最近一直在學習SqlServer 作業方面的知識,總結一下。

一:作業存在的庫。

msdb  use msdb

Msdb數據庫是代理服務數據庫,為其報警、任務調度和記錄操作員的操作提供存儲空間。

二:查看作業分類

 EXEC msdb.dbo.sp_help_category;   
   SELECT  category_id            ,--作業類別ID
          category_class         ,--類別中項目類型:1=作業2=警報 3=操作員
          category_type          ,--類別中類型:=本地、=多服務器、=無
          name                    --分類名稱
     from msdb.dbo.syscategories

 

三:作業常用的幾個步驟:

EXEC msdb.dbo.sp_delete_job  
EXEC msdb.dbo.sp_add_job  
EXEC msdb.dbo.sp_add_jobstep  
EXEC msdb..sp_add_jobschedule  
EXEC msdb.dbo.sp_add_jobserver   
EXEC msdb.dbo.sp_start_job  

 

四:寫一個簡單的案例:

begin transaction
--申明變量
declare @ReturnCode INT
--賦值
select @ReturnCode = 0
--如果不包含
 if not exists  (select * from msdb.dbo.syscategories  where name=N'[Uncategorized (Local)]' and category_class=1)
 begin
 --添加作業分類
  exec @ReturnCode=msdb.dbo.sp_add_category @class=N'JOB',@type=N'LOCAL',@name=N'[Uncategorized (Local)]'
  --上一條語句是否有錯   @ReturnCode 是否賦值     QuitWithRollback  回滾事務
  if (@@ERROR<>0 or @ReturnCode<>0) GOTO  QuitWithRollback
 end

 declare @jobId BINARY(16)
 --名字  第一步  sp_add_job
 EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Proc_SyncBaseData', 
 	@enabled=1, 
	@notify_level_eventlog=0, 
	@notify_level_email=0, 
		@notify_level_netsend=0, 
		@notify_level_page=0, 
		@delete_level=0, 
		@description=N'無描述。', 
		@category_name=N'[Uncategorized (Local)]', 
		--登錄名稱  @jobId有返回值
		@owner_login_name=N'sa', @job_id = @jobId OUTPUT
		IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

		--第二部   sp_add_jobstep
		exec  @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Proc_SyncBaseData',  --作業名稱
	    @step_id=1, 
		@cmdexec_success_code=0, 
		@on_success_action=3, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL',  --步驟的類型
		@command=N'exec Proc_SyncBaseData', --執行的作業 
		@database_name=N'TOPK_DATA', 
		@flags=0 
		IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

		--處理基礎數據
		exec @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'處理基礎數據', 
		@step_id=2, 
		@cmdexec_success_code=0, 
		@on_success_action=1, 
		@on_success_step_id=0, 
		@on_fail_action=2, 
		@on_fail_step_id=0, 
		@retry_attempts=0, 
		@retry_interval=0, 
		@os_run_priority=0, @subsystem=N'TSQL', 
		@command=N'DECLARE @num INT=1
--這兒包括了一些業務代碼就不寫了
@database_name=N'TOPK_DATA',   --數據庫名稱
     @flags=0
     --回滾
     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  --修改
    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

     IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'1',
        @enabled=1,
         @freq_type=4,
         @freq_interval=1,
         @freq_subday_type=1,
        @freq_subday_interval=0,
         @freq_relative_interval=0,
         @freq_recurrence_factor=0,
        @active_start_date=20151231,
         @active_end_date=99991231,
        @active_start_time=10000,
        @active_end_time=235959,
        @schedule_uid=N'81392edd-5c9d-4bf0-a306-4ff22a0920cf'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

 

參考的案例:

    --刪除作業  
    IF  EXISTS (SELECT JOB_ID FROM MSDB.DBO.SYSJOBS_VIEW WHERE NAME =N'作業名稱')   
    EXECUTE MSDB.DBO.SP_DELETE_JOB @JOB_NAME=N'作業名稱'   
      
    --定義創建作業  
    DECLARE @jobid uniqueidentifier  
    EXEC msdb.dbo.sp_add_job  
            @job_name = N'作業名稱',  
            @job_id = @jobid OUTPUT  
      
    --定義作業步驟  
    DECLARE @sql nvarchar(400),@dbname sysname  
    SELECT  @dbname=DB_NAME(), --執行的數據庫(當前)  
            @sql=N'作業步驟內容' --一般定義的是使用TSQL處理的作業,這里定義要執行的Transact-SQL語句  
    EXEC msdb.dbo.sp_add_jobstep  
            @job_id = @jobid,  
            @step_name = N'作業步驟名稱',  
            @subsystem = 'TSQL', --步驟的類型,一般為TSQL  
            @database_name=@dbname,  
            @command = @sql  
      
    --創建調度(使用后面專門定義的幾種作業調度模板)  
    EXEC msdb..sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',  
            @freq_type=4,                --每天  
            @freq_interval=1,            --指定每多少天發生一次,這里是1天.  
            @freq_subday_type=0x8,       --重復方式,0x1=在指定的時間,0x4=多少分鍾,0x8=多少小時執行一次  
            @freq_subday_interval=1,     --重復周期數,這里每小時執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_end_date = 99991231, --作業執行的停止日期,默認為99991231,格式為YYYYMMDD  
            @active_start_time = 00000, --作業執行的開始時間,格式為HHMMSS  
            @active_end_time = 235959    --作業執行的停止時間,格式為HHMMSS  
      
    --添加目標服務器  
    DECLARE @servername sysname  
    SET @servername=CONVERT(nvarchar(128),SERVERPROPERTY(N'ServerName'))--當前SQL實例  
    EXEC msdb.dbo.sp_add_jobserver   
            @job_id = @jobid,  
            @server_name = @servername   
      
    -----------------------------------------------------------------------------------------------  
    --調度模板定義 sp_add_jobschedule  
      
    --只執行一次的作業調度  
    EXEC msdb..sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',  
            @freq_type=1,                --僅執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_start_time = 00000   --作業執行的開始時間,格式為HHMMSS  
      
    --日調度  
    EXEC msdb..sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',  
            @freq_type=4,                --每天  
            @freq_interval=1,            --指定每多少天發生一次,這里是1天.  
            @freq_subday_type=0x8,       --重復方式,(0x1=指定的時間;0x4=多少分鍾;0x8=多少小時)執行一次  
            @freq_subday_interval=1,     --重復周期數,這里每小時執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_end_date = 99991231, --作業執行的停止日期,默認為99991231,格式為YYYYMMDD  
            @active_start_time = 00000, --作業執行的開始時間,格式為HHMMSS  
            @active_end_time = 235959    --作業執行的停止時間,格式為HHMMSS  
      
    --周調度  
    EXEC msdb.dbo.sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',   
            @freq_type = 8,              --每周  
            @freq_recurrence_factor = 1, --每多少周執行一次,這里是每周  
            @freq_interval = 62,         --在星期幾執行,由POWER(2,N)表示,N的值為0~6,代表星期日~星期六,如果指定兩個,則將值相加,例如,值為65表示在星期天和星期日執行(POWER(2,0)+POWER(2,6))  
            @freq_subday_type = 0x8,     --重復方式,0x1=在指定的時間,0x4=多少分鍾,0x8=多少小時執行一次  
            @freq_subday_interval = 1,   --重復周期數,這里每小時執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_end_date = 99991231, --作業執行的停止日期,默認為99991231,格式為YYYYMMDD  
            @active_start_time = 00000, --作業執行的開始時間,格式為HHMMSS  
            @active_end_time = 235959    --作業執行的停止時間,格式為HHMMSS  
      
    --月調度(每X個月的每月幾號)  
    EXEC msdb.dbo.sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',   
            @freq_type = 16,             --每月  
            @freq_recurrence_factor = 2, --每多少月執行一次,這里是每2個月  
            @freq_interval = 2,          --在執行月的第幾天執行,這里是第2天  
            @freq_subday_type = 0x8,     --重復方式,0x1=在指定的時間,0x4=多少分鍾,0x8=多少小時執行一次  
            @freq_subday_interval = 1,   --重復周期數,這里每小時執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_end_date = 99991231, --作業執行的停止日期,默認為99991231,格式為YYYYMMDD  
            @active_start_time = 00000, --作業執行的開始時間,格式為HHMMSS  
            @active_end_time = 235959    --作業執行的停止時間,格式為HHMMSS  
      
    --月調度(每X個月的相對時間)  
    EXEC msdb.dbo.sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',   
            @freq_type = 32,             --每月  
            @freq_recurrence_factor = 2, --每多少月執行一次,這里是每2個月  
            @freq_interval = 9,          --在當月的那個時間執行,1~7=星期日至星期六,8=日 ,9=工作日,10=周末  
            @freq_relative_interval = 1, --在第幾個相對時間執行,允許的值為1,2,4,8代表第1~4個相對時間,16表示最后一個相對時間  
            @freq_subday_type = 0x8,     --重復方式,0x1=在指定的時間,0x4=多少分鍾,0x8=多少小時執行一次  
            @freq_subday_interval = 1,   --重復周期數,這里每小時執行一次  
            @active_start_date = NULL,   --作業執行的開始日期,為NULL時表示當前日期,格式為YYYYMMDD  
            @active_end_date = 99991231, --作業執行的停止日期,默認為99991231,格式為YYYYMMDD  
            @active_start_time = 00000, --作業執行的開始時間,格式為HHMMSS  
            @active_end_time = 235959    --作業執行的停止時間,格式為HHMMSS  
      
    --在特定時候執行的作業調度  
    EXEC msdb.dbo.sp_add_jobschedule  
            @job_id = @jobid,  
            @name = N'調度名稱',   
            @freq_type = 64     --64=在SQLServerAgent 服務啟動時運行,128=計算機空閑時運行  
      
    -----------------------------------------------------------------------------------------------  



[sql] view plain copy
在CODE上查看代碼片派生到我的代碼片

    IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[DBO].SP_AUTO_CREATEJOB') AND OBJECTPROPERTY(ID, N'ISPROCEDURE') = 1)  
    DROP PROCEDURE [DBO].SP_AUTO_CREATEJOB  
    GO  
      
    CREATE PROCEDURE DBO.SP_AUTO_CREATEJOB  
                            @DBNAME VARCHAR(100),    --執行數據庫     
                            @JOBNAME VARCHAR(100),       
                            @EXECSQL NVARCHAR(4000) --執行語句        
    AS       
    PRINT '----作業 :'+@JOBNAME  
    PRINT '----開始執行:'  +@EXECSQL  
      
    BEGIN TRANSACTION     
    DECLARE     
        @JOBID UNIQUEIDENTIFIER,         
        @RETURNCODE INT      
        SELECT @RETURNCODE = 0                
    BEGIN           
        IF  EXISTS (SELECT JOB_ID FROM MSDB.DBO.SYSJOBS_VIEW WHERE NAME =@JOBNAME)   
        EXECUTE MSDB.DBO.SP_DELETE_JOB @JOB_NAME=@JOBNAME   
                
        EXECUTE @RETURNCODE = MSDB.DBO.SP_ADD_JOB       --返回值:0成功,1失敗  
                            @JOB_NAME = @JOBNAME,              
                            @ENABLED = 1,               --狀態。默認值為 1(啟用),為 0 不啟用  
                            @OWNER_LOGIN_NAME = 'SA',   --擁有作業的登錄名。默認值為 NULL,可解釋為當前登錄名  
                            @JOB_ID = @JOBID OUTPUT                      
        IF (@@ERROR <> 0 OR @RETURNCODE <> 0) GOTO QUITWITHROLLBACK    
                         
        EXECUTE @RETURNCODE = MSDB.DBO.SP_ADD_JOBSTEP   
                            @JOB_ID = @JOBID,                
                            @STEP_NAME = N'STEP1',      --步驟名稱     
                            @SUBSYSTEM = 'TSQL',        --步驟的類型,一般為TSQL           
                            @DATABASE_NAME = @DBNAME,   --執行數據庫                
                            @COMMAND = @EXECSQL         --執行語句               
        IF (@@ERROR <> 0 OR @RETURNCODE <> 0) GOTO QUITWITHROLLBACK       
                       
        EXECUTE @RETURNCODE = MSDB.DBO.SP_UPDATE_JOB   
                            @JOB_ID = @JOBID,                 
                            @START_STEP_ID = 1          --作業中要執行的第一個步驟的標識號  
        IF (@@ERROR <> 0 OR @RETURNCODE <> 0) GOTO QUITWITHROLLBACK   
                                 
        EXECUTE @RETURNCODE = MSDB.DBO.SP_ADD_JOBSERVER   
                            @JOB_ID = @JOBID,                     
                            @SERVER_NAME = N'(LOCAL)'                           
        IF (@@ERROR <> 0 OR @RETURNCODE <> 0) GOTO QUITWITHROLLBACK      
              
    END   
    COMMIT TRANSACTION    
         
    GOTO ENDSAVE    
                            
    QUITWITHROLLBACK:           
        IF (@@TRANCOUNT > 0)     
        BEGIN          
            ROLLBACK TRANSACTION          
            RETURN 1    
        END     
             
    ENDSAVE:         
    EXEC @RETURNCODE = MSDB.DBO.SP_START_JOB @JOB_ID = @JOBID  --啟動作業   
    RETURN @RETURNCODE    

 

創建作業的步驟:

創建作業的步驟一般如下所示:

  1. 執行 sp_add_job 來創建作業。
  2. 執行 sp_add_jobstep 來創建一個或多個作業步驟。

  3. 執行 sp_add_schedule 來創建計划。

  4. 執行 sp_attach_schedule 將計划附加到作業。

  5. 執行 sp_add_jobserver 來設置作業的服務器。

 

作業系統表:

  1. 雲棲社區>
  2. 博客列表>
  3. 正文

SQL SERVER 作業淺析

 
瀟湘隱者 2016-04-25 14:53:24 瀏覽226 評論0

摘要: 作業介紹     SQL SERVER的作業是一系列由SQL SERVER代理按順序執行的指定操作。作業可以執行一系列活動,包括運行Transact-SQL腳本、命令行應用程序、Microsoft ActiveX腳本、Integration Services 包、Analysis Services 命令和查詢或復制任務。

作業介紹

    SQL SERVER的作業是一系列由SQL SERVER代理按順序執行的指定操作。作業可以執行一系列活動,包括運行Transact-SQL腳本、命令行應用程序、Microsoft ActiveX腳本、Integration Services 包、Analysis Services 命令和查詢或復制任務。作業可以運行重復任務或那些可計划的任務,它們可以通過生成警報來自動通知用戶作業狀態,從而極大地簡化了 SQL Server 管理[參見MSDN]。

    創建作業、刪除作業、查看作業歷史記錄....等所有操作都可以通過SSMS管理工具GUI界面操作,有時候也確實挺方便的。但是當一個實例有多個作業或 多個數據庫實例時,通過圖形化的界面去管理、維護作業也是個頭痛的問題,對於SQL腳本與GUI界面管理維護作業熟優熟劣這個問題,只能說要看場合。下面 主要介紹通過SQL腳本來管理、維護作業。

作業分類

    創建作業時,往往需要指定作業類別,如果不指定新建作業類別,就會默認為“[未分類(本地)]”,如下截圖所示:

clipboard

 

    當然,你可以查看、添加、刪除、修改作業分類。請看下面操作。

1:查看作業分類

Code Snippet
  1. --method 1:
  2. EXEC msdb.dbo.sp_help_category;
  3.  
  4. GO
  5.  
  6. --method 2:
  7.   SELECT  category_id            ,--作業類別ID
  8.           category_class         ,--類別中項目類型:1=作業2=警報 3=操作員
  9.           category_type          ,--類別中類型:=本地、=多服務器、=無
  10.           name                    --分類名稱
  11.     FROMmsdb.dbo.syscategories

有興趣的可以研究一下存儲過程msdb.dbo.sp_help_category

 

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_help_category
@class  VARCHAR(8)   = 'JOB',
@type   VARCHAR(12)  = NULL,
@name   sysname      = NULL,
@suffix BIT          = 0
AS
BEGIN
DECLARE @retval         INT
DECLARE @type_in        VARCHAR(12)
DECLARE @category_type  INT
DECLARE @category_class INT
DECLARE @where_clause   NVARCHAR(255)
DECLARE @cmd            NVARCHAR(255)
SET NOCOUNT ON
SELECT @class = LTRIM(RTRIM(@class))
SELECT @type  = LTRIM(RTRIM(@type))
SELECT @name  = LTRIM(RTRIM(@name))
IF (@type = '') SELECT @type = NULL
IF (@name = N'') SELECT @name = NULL
IF (@class = 'JOB') AND (@type IS NULL)
SELECT @type_in = 'LOCAL'
ELSE
IF (@class <> 'JOB') AND (@type IS NULL)
SELECT @type_in = 'NONE'
ELSE
SELECT @type_in = @type
EXECUTE @retval = sp_verify_category @class,
@type_in,
NULL,
@category_class OUTPUT,
@category_type  OUTPUT
IF (@retval <> 0)
RETURN(1)
IF (@suffix <> 0)
SELECT @suffix = 1
IF @name IS NOT NULL AND
NOT EXISTS(SELECT * FROM msdb.dbo.syscategories WHERE name = @name
AND category_class = @category_class)
BEGIN
DECLARE @category_class_string NVARCHAR(25)
SET @category_class_string = CAST(@category_class AS nvarchar(25))
RAISERROR(14526, -1, -1, @name, @category_class_string)
RETURN(1)
END
SELECT @where_clause = N'WHERE (category_class = ' + CONVERT(NVARCHAR, @category_class) + N') '
IF (@name IS NOT NULL)
SELECT @where_clause = @where_clause + N'AND (name = N' + QUOTENAME(@name, '''') + N') '
IF (@type IS NOT NULL)
SELECT @where_clause = @where_clause + N'AND (category_type = ' + CONVERT(NVARCHAR, @category_type) + N') '
SELECT @cmd = N'SELECT category_id, '
IF (@suffix = 1)
BEGIN
SELECT @cmd = @cmd + N'''category_type'' = '
SELECT @cmd = @cmd + N'CASE category_type '
SELECT @cmd = @cmd + N'WHEN 0 THEN ''NONE'' '
SELECT @cmd = @cmd + N'WHEN 1 THEN ''LOCAL'' '
SELECT @cmd = @cmd + N'WHEN 2 THEN ''MULTI-SERVER'' '
SELECT @cmd = @cmd + N'WHEN 3 THEN ''NONE'' '
SELECT @cmd = @cmd + N'ELSE FORMATMESSAGE(14205) '
SELECT @cmd = @cmd + N'END, '
END
ELSE
BEGIN
SELECT @cmd = @cmd + N'category_type, '
END
SELECT @cmd = @cmd + N'name '
SELECT @cmd = @cmd + N'FROM msdb.dbo.syscategories '
EXECUTE (@cmd + @where_clause + N'ORDER BY category_type, name')
RETURN(@@error)
END
GO

sp_help_category

2:添加作業分類

如下所示,添加一個叫"DBA_MONITORING"的作業分類

Code Snippet
  1. EXEC msdb.dbo.sp_add_category
  2.     @class=N'JOB',
  3.     @type=N'LOCAL',
  4.     @name=N'DBA_MONITORING' ;
  5.  
  6. GO
  7.  
  8.   
  9.  
  10. SELECT * FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING'
  11.  
  12.  category_id category_class category_type    name
  13. ----------- -------------- ------------- -------------
  14. 102         1              1             DBA_MONITORING

 

有興趣的可以研究一下存儲過程msdb.dbo.sp_add_category

 

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_add_category
@class VARCHAR(8)   = 'JOB',
@type  VARCHAR(12)  = 'LOCAL',
@name  sysname
AS
BEGIN
DECLARE @retval         INT
DECLARE @category_type  INT
DECLARE @category_class INT
SET NOCOUNT ON
SELECT @class = LTRIM(RTRIM(@class))
SELECT @type  = LTRIM(RTRIM(@type))
SELECT @name  = LTRIM(RTRIM(@name))
EXECUTE @retval = sp_verify_category @class,
@type,
@name,
@category_class OUTPUT,
@category_type  OUTPUT
IF (@retval <> 0)
RETURN(1)
IF (EXISTS (SELECT *
FROM msdb.dbo.syscategories
WHERE (category_class = @category_class)
AND (name = @name)))
BEGIN
RAISERROR(14261, -1, -1, '@name', @name)
RETURN(1)
END
INSERT INTO msdb.dbo.syscategories (category_class, category_type, name)
VALUES (@category_class, @category_type, @name)
RETURN(@@error)
END
GO

sp_add_category

 

3:刪除作業分類

如下所示,刪除一個叫"DBA_MONITORING" 的作業分類

Code Snippet
  1. EXEC msdb.dbo.sp_delete_category
  2.     @name = N'DBA_MONITORING',
  3.     @class = N'JOB' ;
  4.  
  5. GO

 

有興趣的可以研究一下存儲過程msdb.dbo.sp_delete_category

 

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_delete_category
@class VARCHAR(8),
@name  sysname
AS
BEGIN
DECLARE @retval         INT
DECLARE @category_id    INT
DECLARE @category_class INT
DECLARE @category_type  INT
SET NOCOUNT ON
SELECT @class = LTRIM(RTRIM(@class))
SELECT @name  = LTRIM(RTRIM(@name))
EXECUTE @retval = sp_verify_category @class,
NULL,
NULL,
@category_class OUTPUT,
NULL
IF (@retval <> 0)
RETURN(1)
SELECT @category_id = category_id,
@category_type = category_type
FROM msdb.dbo.syscategories
WHERE (category_class = @category_class)
AND (name = @name)
IF (@category_id IS NULL)
BEGIN
RAISERROR(14262, -1, -1, '@name', @name)
RETURN(1)
END
IF (@category_id < 100)
BEGIN
RAISERROR(14276, -1, -1, @name, @class)
RETURN(1)
END
BEGIN TRANSACTION
UPDATE msdb.dbo.sysjobs
SET category_id = CASE @category_type
WHEN 1 THEN 0
WHEN 2 THEN 2
END
WHERE (category_id = @category_id)
UPDATE msdb.dbo.sysalerts
SET category_id = 98
WHERE (category_id = @category_id)
UPDATE msdb.dbo.sysoperators
SET category_id = 99
WHERE (category_id = @category_id)
DELETE FROM msdb.dbo.syscategories
WHERE (category_id = @category_id)
COMMIT TRANSACTION
RETURN(0)
END
GO

sp_delete_category



 4:修改作業類別

 

msdb.dbo.sp_update_category
     [@class =] 'class' , 
     [@name =] 'old_name' ,
     [@new_name =] 'new_name'

 

有興趣的可以研究一下存儲過程msdb.dbo.sp_update_category

 

 

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_update_category
@class    VARCHAR(8),
@name     sysname,
@new_name sysname
AS
BEGIN
DECLARE @retval         INT
DECLARE @category_id    INT
DECLARE @category_class INT
SET NOCOUNT ON
SELECT @class    = LTRIM(RTRIM(@class))
SELECT @name     = LTRIM(RTRIM(@name))
SELECT @new_name = LTRIM(RTRIM(@new_name))
IF @name = ''  SELECT @name = NULL
EXECUTE @retval = sp_verify_category @class,
NULL,
@new_name,
@category_class OUTPUT,
NULL
IF (@retval <> 0)
RETURN(1)
IF @name IS NOT NULL AND
NOT EXISTS(SELECT * FROM msdb.dbo.syscategories WHERE name = @name
AND category_class = @category_class)
BEGIN
RAISERROR(14526, -1, -1, @name, @category_class)
RETURN(1)
END
SELECT @category_id = category_id
FROM msdb.dbo.syscategories
WHERE (category_class = @category_class)
AND (name = @new_name)
IF (@category_id IS NOT NULL)
BEGIN
RAISERROR(14261, -1, -1, '@new_name', @new_name)
RETURN(1)
END
IF (@category_id < 100)
BEGIN
RAISERROR(14276, -1, -1, @name, @class)
RETURN(1)
END
UPDATE msdb.dbo.syscategories
SET name = @new_name
WHERE (category_class = @category_class)
AND (name = @name)
RETURN(@@error)
END
GO

sp_update_category

分析上面四個存儲過程可以看出,實質上新增、修改、刪除、查看作業類別無非就是對表 msdb.dbo.syscategories進行操作,只是通過存儲過程封裝了而已,增加了驗證等操作,確保數據完整性。

新建作業

 

創建作業的步驟一般如下所示:

  1. 執行 sp_add_job 來創建作業。
  2. 執行 sp_add_jobstep 來創建一個或多個作業步驟。

  3. 執行 sp_add_schedule 來創建計划。

  4. 執行 sp_attach_schedule 將計划附加到作業。

  5. 執行 sp_add_jobserver 來設置作業的服務器。

本地作業是由本地 SQL Server 代理進行緩存的。因此,任何修改都會隱式強制 SQL Server 代理重新緩存該作業。由於直到調用 sp_add_jobserver 時,SQL Server 代理才緩存作業,因此最后調用 sp_add_jobserver 將更為有效。

下面看用腳本新建一個作業用來每天執行exec sp_cycle_errorlog ,實現錯誤日志循環, 從下面的腳本量來看,用腳本新建一個作業確實工作量很大,而且容易出錯,GUI圖形界面創建作業要方便得多,但是如果遷移數據庫時,用腳本來新建作業是相 當方便的。比GUI圖形界面新建一個作業快捷方便多了。

Code Snippet
  1. USE [msdb]
  2. GO
  3.  
  4. /****** Object:  Job [JOB_CYCLE_ERRORLOG]    Script Date: 08/23/2013 15:25:09 ******/
  5.   IFEXISTS(SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'JOB_CYCLE_ERRORLOG')
  6. EXEC msdb.dbo.sp_delete_job@job_id=N'a5dff08b-95f8-498e-a6c9-59241fe197b4', @delete_unused_schedule=1
  7. GO
  8.  
  9. USE [msdb]
  10. GO
  11.  
  12. /****** Object:  Job [JOB_CYCLE_ERRORLOG]    Script Date: 08/23/2013 15:25:09 ******/
  13. BEGIN TRANSACTION
  14. DECLARE @ReturnCode INT
  15. SELECT @ReturnCode = 0
  16. /****** Object:  JobCategory [DBA_MATIANCE]    Script Date: 08/23/2013 15:25:09 ******/
  17. IF NOT EXISTS(SELECT name FROM msdb.dbo.syscategories WHERE name=N'DBA_MATIANCE' AND category_class=1)
  18. BEGIN
  19. EXEC @ReturnCode = msdb.dbo.sp_add_category@class=N'JOB', @type=N'LOCAL', @name=N'DBA_MATIANCE'
  20. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  21.  
  22. END
  23.  
  24. DECLARE @jobId BINARY(16)
  25.   EXEC @ReturnCode =msdb.dbo.sp_add_job@job_name=N'JOB_CYCLE_ERRORLOG',
  26.         @enabled=1,
  27.         @notify_level_eventlog=0,
  28.         @notify_level_email=0,
  29.         @notify_level_netsend=0,
  30.         @notify_level_page=0,
  31.         @delete_level=0,
  32.         @description=N'每天執行exec sp_cycle_errorlog 實現錯誤日志循環。',
  33.         @category_name=N'DBA_MATIANCE',
  34.         @owner_login_name=N'sa', @job_id = @jobId OUTPUT
  35. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  36. /****** Object:  Step [Step 1: recycle the errorlog]    Script Date: 08/23/2013 15:25:09 ******/
  37. EXEC @ReturnCode = msdb.dbo.sp_add_jobstep@job_id=@jobId, @step_name=N'Step 1: recycle the errorlog',
  38.         @step_id=1,
  39.         @cmdexec_success_code=0,
  40.         @on_success_action=1,
  41.         @on_success_step_id=0,
  42.         @on_fail_action=2,
  43.         @on_fail_step_id=0,
  44.         @retry_attempts=0,
  45.         @retry_interval=0,
  46.         @os_run_priority=0, @subsystem=N'TSQL',
  47.         @command=N'exec msdb.dbo.sp_cycle_errorlog',
  48.         @database_name=N'msdb',
  49.         @flags=0
  50. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  51. EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
  52. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  53. EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Job Schedule',
  54.         @enabled=1,
  55.         @freq_type=4,
  56.         @freq_interval=1,
  57.         @freq_subday_type=1,
  58.         @freq_subday_interval=0,
  59.         @freq_relative_interval=0,
  60.         @freq_recurrence_factor=0,
  61.         @active_start_date=20130823,
  62.         @active_end_date=99991231,
  63.         @active_start_time=0,
  64.         @active_end_time=235959,
  65.         @schedule_uid=N'2099c694-cd26-4edf-8803-179227bf8770'
  66. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  67. EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
  68. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  69. COMMIT TRANSACTION
  70. GOTO EndSave
  71. QuitWithRollback:
  72.     IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
  73. EndSave:
  74.  
  75. GO

作業系統表

 

SELECT * FROM msdb.dbo.sysjobs            --存儲將由 SQL Server 代理執行的各個預定作業的信息

SELECT * FROM msdb.dbo.sysjobschedules    --包含將由 SQL Server 代理執行的作業的計划信息

SELECT * FROM msdb.dbo.sysjobactivity;    --記錄當前 SQL Server 代理作業活動和狀態

SELECT * FROM msdb.dbo.sysjobservers      --存儲特定作業與一個或多個目標服務器的關聯或關系

SELECT * FROM msdb.dbo.sysjobsteps;       --包含 SQL Server 代理要執行的作業中的各個步驟的信息

SELECT * FROM msdb.dbo.sysjobstepslogs;   --包含所有 SQL Server 代理作業步驟的作業步驟日志

SELECT * FROM msdb.dbo.sysjobs_view;      --

SELECT * FROM msdb.dbo.sysjobhistory      --包含有關 SQL Server 代理執行預定作業的信息

SELECT * FROM msdb.dbo.syscategories      --包含由 SQL Server Management Studio 用來組織作業、警報和操作員的類別

 

啟動作業:

通過Sql 命令啟動作業:

語法:

 

sp_start_job 
     {   [@job_name =] 'job_name'
       | [@job_id =] job_id }
     [ , [@error_flag =] error_flag]
     [ , [@server_name =] 'server_name']
     [ , [@step_name =] 'step_name']
     [ , [@output_flag =] output_flag]
     
例子:

exec msdb.dbo.sp_start_job @job_name='JOB_CYCLE_ERRORLOG'

 

 

停止作業:

語法:
sp_stop_job 
      [@job_name =] 'job_name'
    | [@job_id =] job_id 
    | [@originating_server =] 'master_server'
    | [@server_name =] 'target_server'

例子:
exec msdb.dbo.sp_stop_job    @job_name='JOB_CYCLE_ERRORLOG'

 

啟用和禁用作業:

語法:
sp_update_job [ @job_id =] job_id | [@job_name =] 'job_name'
     [, [@new_name =] 'new_name' ] 
     [, [@enabled =] enabled ]
     [, [@description =] 'description' ] 
     [, [@start_step_id =] step_id ]
     [, [@category_name =] 'category' ] 
     [, [@owner_login_name =] 'login' ]
     [, [@notify_level_eventlog =] eventlog_level ]
     [, [@notify_level_email =] email_level ]
     [, [@notify_level_netsend =] netsend_level ]
     [, [@notify_level_page =] page_level ]
     [, [@notify_email_operator_name =] 'email_name' ]
          [, [@notify_netsend_operator_name =] 'netsend_operator' ]
          [, [@notify_page_operator_name =] 'page_operator' ]
     [, [@delete_level =] delete_level ] 
     [, [@automatic_post =] automatic_post ]

列子:

EXEC msdb.dbo.sp_update_job
    @job_name = N'JOB_CYCLE_ERRORLOG',
    @enabled = 0 ;  --0 禁用作業、  1啟用作業
GO

 刪除作業:

sp_delete_job { [ @job_id = ] job_id | [ @job_name = ] 'job_name' } ,
[ , [ @originating_server = ] 'server' ]
[ , [ @delete_history = ] delete_history ]
[ , [ @delete_unused_schedule = ] delete_unused_schedule ] 例子: EXEC msdb.dbo.sp_delete_job @job_name = 'JOB_CYCLE_ERRORLOG';

 

 

常用管理作業SQL:

1:查看屬於某個數據庫的所有作業。

    SELECT j.job_id        AS JOB_ID            ,
           name            AS JOB_NAME          ,
           enabled         AS JOB_ENABLED       ,
           description     AS JOB_DESCRIPTION   ,
           date_created    AS DATE_CREATED      ,
           date_modified   AS DATE_MODIFIED
    FROM msdb.dbo.sysjobs j
    WHERE   job_id IN( SELECT job_id
                      FROM    msdb.dbo.sysjobsteps
                      WHERE   database_name = 'DataBaseName' )

 2:查看某個作業類別的所有作業

    SELECT  j.name             AS Job_Name       ,
             j.description      AS Job_Description ,
             j.date_created     AS Date_Created    ,
             j.date_modified    AS Date_Modified   ,
             c.name             AS Job_Class
    FROM  msdb.dbo.sysjobs j
          LEFT JOIN msdb.dbo.syscategories c ON j.category_id = c.category_id
     WHEREc.name = '[Uncategorized (Local)]'

 

3:查看禁用/啟用的作業

 

SELECT * FROM msdb.dbo.sysjobs WHERE  enabled=0    --0:禁用 1:為啟用

 

 

4:查看出錯的作業記錄

 4.1:查詢那些作業在今天出錯(如果要查詢歷史出錯作業,去掉查詢時間條件即可)

 

 SELECT name               AS JOB_NAME        ,
          description         AS JOB_Description ,
          date_created        AS Date_Created    ,
          date_modified       AS Date_Modified
    FROM  msdb.dbo.sysjobs
    WHERE enabled = 1
          AND job_id IN(
          SELECT  job_id
          FROM    Msdb.dbo.sysjobhistory
         WHERE   run_status = 0
                 AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT) )

 

 4.2:查看出錯詳細信息

 

    SELECT j.name                AS JOB_NAME ,
          h.step_id              AS STEP_ID  ,
          h.step_name            AS STEP_NAME,
          h.message              AS ERR_MSG  ,
          h.run_date             AS RUN_DATE ,
          h.run_time             AS RUN_TIME ,
          msdb.dbo.agent_datetime(h.run_date, h.run_time) AS 'RunDateTime' ,
          CAST(run_duration / 10000 AS VARCHAR(2)) + N'小時'
        + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))
        + N'分鍾' + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                              LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)
        + N'秒' AS run_duration
    FROM  msdb.dbo.sysjobhistory h
          LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
    WHERE run_status = 0
          AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)

 

 

5:查看作業的執行時間:

5.1:查看當天成功執行的作業的時間(查看的是作業Step信息)

 

 SELECT j.name         AS job_name ,
          h.step_id      AS step_id  ,
          h.step_name     AS step_name,
          h.message       AS Message  ,
          h.run_date      AS Run_date ,
          h.run_time      AS run_time ,
          msdb.dbo.agent_datetime(h.run_date, h.run_time) AS 'RunDateTime' ,
          CAST(run_duration / 10000 AS VARCHAR(2)) + N'小時'
          + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))
          + N'分鍾' + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                              LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)
          + N'秒' AS run_duration
    FROM msdb.dbo.sysjobhistory h
          LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
     WHERE run_status = 1
          AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)
          ORDER BY run_duration DESC

 

 5.2:查詢每個作業的執行時間、按執行時間降序

    SELECT  j.name            AS JOB_NAME ,
            h.run_date        AS RUN_DATE ,
            SUM(run_duration) AS SUM_DURATION
    FROM  msdb.dbo.sysjobhistory h
            LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
    WHERE run_status = 1
            AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)
    GROUP BY name ,
            run_date
    ORDER BY Sum_Duration DESC

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM