Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Configura i processi SQL in SQL Server utilizzando T-SQL

SQL Server Agent è un componente utilizzato per l'automazione delle attività del database. Ad esempio, dobbiamo eseguire la manutenzione dell'Indice sui server di produzione solo durante l'orario non lavorativo. Quindi, creiamo un processo di SQL Server per l'esecuzione della manutenzione dell'indice e lo pianifichiamo per le ore "off".

Quando installiamo SQL Server, il servizio SQL Server Agent è disabilitato. Innanzitutto, lo abilitiamo e lo avviamo manualmente. Quindi, configuriamo il processo di SQL Server, utilizzando SQL Server Management Studio e le stored procedure di sistema del database MSDB.

Questo articolo spiega come creare un processo di SQL Server utilizzando le stored procedure di sistema del database MSDB.

Le procedure memorizzate di sistema del database MSDB

SQL Server utilizza i seguenti:

  1. sp_add_job :la procedura è per creare un nuovo lavoro. Se ha esito positivo, restituisce @job_id. Sono applicabili i seguenti argomenti:
  • @nome_lavoro:è un nome lavoro univoco.
  • @enabled:il lavoro è abilitato o disabilitato. Una volta creato un lavoro, puoi impostare il valore del parametro su 1 per abilitare il lavoro.
  • @notify_level_eventlog:questo parametro viene utilizzato per scrivere lo stato del processo SQL nel visualizzatore eventi di Windows.
Valore Descrizione
0 Il risultato del lavoro non verrà scritto nel registro eventi.
1 Se il lavoro viene eseguito correttamente, il risultato verrà scritto nel visualizzatore di eventi
2 (valore predefinito) Se il lavoro non riesce, il risultato e il messaggio di errore verranno scritti nel visualizzatore di eventi
3 Il risultato del lavoro viene scritto nel visualizzatore di eventi.
  • @notify_level_email:questo parametro serve per inviare l'e-mail sull'esito del processo SQL. I valori validi del parametro sono gli stessi dei valori dell'argomento @notify_level_eventlog.
  • @notify_level_page:questo parametro serve per inviare al pager la notifica dell'esito del processo SQL. I valori validi dei parametri sono gli stessi dei valori dell'argomento @notify_level_eventlog.
  • @delete_level:questo parametro serve per eliminare il lavoro dopo il completamento. In questo caso, il valore del parametro dovrebbe essere 1. Si noti che il valore predefinito è 0; quindi, non cancellerà il lavoro dopo il completamento.
  • @categoria_livello:questo parametro indica i valori della categoria di lavoro. Il valore predefinito è NULL.
  • @nome_accesso_proprietario:il valore è il nome di dominio o il nome di accesso SQL del proprietario del lavoro.

2. Sp_add_jobserver: Questa procedura memorizzata serve a specificare il server di destinazione per l'esecuzione del processo SQL. La procedura accetta i seguenti argomenti:

  • @job_id:è un IDENTIFICATORE UNICO del lavoro SQL. Il valore predefinito di questo argomento è NULL.
  • @nome_lavoro:è il nome del lavoro SQL.
  • @nome_server:è il nome del server su cui si desidera eseguire il lavoro SQL. Il valore dell'argomento predefinito può essere il server locale (LOCAL) o il nome host del server di destinazione.

3. sp_add_jobstep: Questa procedura memorizzata funziona per aggiungere il passaggio del lavoro in SQL Job. La procedura utilizza i seguenti argomenti:

  • @nome_lavoro:il nome del lavoro in cui stai aggiungendo il passaggio. È un SYSNAME con NULL come valore predefinito.
  • @nome_passo:il nome del passo. È un SYSNAME con NULL come valore predefinito.
  • @step_id:l'ID sequenziale della fase del lavoro. È un numero incrementale senza spazi vuoti. È un valore INT e il valore predefinito è NULL.
  • @cmdexec_success_code:questo valore viene restituito dal sottosistema CmdExec. Indica se l'esecuzione del comando è andata a buon fine. Il codice è un valore int con 0 come valore predefinito.
  • @on_sucess_action:questo valore indica l'azione che deve essere eseguita dopo che la fase del lavoro è stata completata correttamente. I valori possono essere uno qualsiasi dei seguenti:
Valore Descrizione
1 Lascia il lavoro e torna con successo
2 Esci dal lavoro e ritorno non riuscito
3 Vai al passaggio del lavoro successivo
4 Vai all'ID del passaggio di on_success_step_id
  • @on_fail_action:specifica quale azione eseguire se le fasi del lavoro falliscono. È un valore INT e il valore predefinito è NULL.
  • @retry_attempt:specifica il numero di tentativi dopo la fase di lavoro non riuscita. È un valore INT e il valore predefinito è NULL.
  • @retry_interval:imposta l'intervallo di tempo (minuti) tra due tentativi di errore del passaggio del processo SQL. È un valore INT e il valore predefinito è NULL.
  • @os_run_priority:
  • @Subsystem:specificare il nome del sottosistema utilizzato da SQL Server Agent per eseguire il comando. I valori validi sono i seguenti:
Valore del sottosistema Descrizione
CmdExec Comando del sistema operativo o file eseguibile(*.exe,*.bat)
QUERY DI ANALISI Query del servizio di analisi di SQL Server, ad esempio MDX, DMX.
QUERY DI ANALISI Comando del servizio di analisi di SQL Server, ad esempio XMLA.
SSIS Pacchetto del servizio di integrazione di SQL Server.
PowerShell Comando o script di PowerShell.
T-SQL Query T-SQL o stored procedure
Distribuzione Agente di distribuzione della replica di SQL Server.
Istantanea Agente snapshot di replica di SQL Server.
Lettore registro Agente di lettura log di replica SQL Server.
Queuerereader Lettore della coda di replica di SQL Server.
  • @command:specifica il comando che il servizio SQL Server Agent deve eseguire tramite il sottosistema. Il tipo di dati è varchar(max) e il valore predefinito è NULL.
  • @Nome_database:specificare il nome del database in cui si desidera eseguire il comando. Questo parametro è utile quando si esegue uno script T-SQL utilizzando SQL Server Agent.

4. Sp_add_jobschedule: la procedura memorizzata serve per creare la pianificazione del lavoro SQL. Questa procedura utilizza i seguenti argomenti:

  • @nome_lavoro:specifica il nome del lavoro SQL. La pianificazione verrà effettuata per il lavoro SQL specificato nell'argomento @job_name.
  • @name:il nome della pianificazione. Il tipo di dati è varchar e il valore predefinito è NULL.
  • @enabled:imposta 1 per abilitare la pianificazione o 0 per disabilitare la pianificazione.
  • @freq_type:indica l'ora di esecuzione del lavoro SQL. Il tipo di dati del parametro è INT e il valore predefinito è 0. I valori validi sono uno dei seguenti:
Valore Descrizione
1 Il lavoro verrà eseguito solo una volta.
4 Giornaliero.
8 Settimanale
16 Mensile
64 Esegui il processo all'avvio del servizio SQL Server Agent
128 Esegui il lavoro SQL quando il server è inattivo.
  • @freq_interval:indica il giorno dell'esecuzione del lavoro SQL. Il tipo di dati è INT e il valore predefinito è 0. Il valore dipende dal valore specificato nel parametro @freq_type. I valori validi sono uno dei seguenti:
Valore Effetto sulla pianificazione dei lavori
1 (Una volta) Il @Freq_interval non verrà utilizzato.
4 (giornaliero) Ogni @freq_interval giorni
8 Il valore di @Freq_interval può essere uno dei seguenti:
1 =domenica
2 =lunedì
4 =Martedì
8 =mercoledì
16 =giovedì
32 =venerdì
64 =sabato
16 Esegui il lavoro su @Freq_interval giorno del mese
64 Il @Freq_interval non verrà utilizzato
128 Il @Freq_interval non verrà utilizzato
  • @freq_subday_type:specifica l'unità di freq_subday_interval. Il tipo di dati è INT e il valore predefinito è NULL.
  • @active_start_date:imposta la data in cui vuoi iniziare l'esecuzione del lavoro. Il tipo di dati è INT e non ha un valore predefinito. Il formato della data è AAAAMMGG. Il valore deve essere maggiore o uguale a 19900101.
  • @active_end_date:specifica la data in cui interrompere l'esecuzione del lavoro. Il tipo di dati è INT, senza valore predefinito. Il formato della data è AAAAMMGG e il valore deve essere maggiore o uguale a 19900101.
  • @active_start_time:specificare l'ora in cui si desidera avviare l'esecuzione del lavoro. Il tipo di dati è INT, senza un valore predefinito. Il formato dell'ora è HHMMSS.
  • @active_end_time:specifica l'ora in cui vuoi interrompere l'esecuzione del lavoro. Il tipo di dati è INT, senza un valore predefinito. Il formato dell'ora è HHMMSS.

Codice T-SQL per creare un processo SQL

Per illustrare i processi, utilizziamo SQL Server 2019 sulla workstation con AdventureWorks2017 database, ripristinato da un backup. Creiamo un processo SQL denominato Backup completo giornaliero – genera un backup di AdventureWorks2017 database e lo copia su C:\Backups posizione.

Innanzitutto, dobbiamo abilitare gli Agent XP. È un'opzione avanzata. Pertanto, abilitiamo prima l'opzione di configurazione avanzata e il componente Agent XPs.

Per farlo, esegui la seguente query:

EXEC Sp_configure 
  'Show advanced options', 
  1 

go 

RECONFIGURE WITH override 

EXEC Sp_configure 
  'Agent XPs', 
  1 

go 

RECONFIGURE WITH override 

Una volta abilitato l'agente, avviamo il servizio dell'agente.

Aprire SQL Server Management Studio e connettersi all'istanza di SQL Server. Quindi, fare clic con il pulsante destro del mouse su SQL Server Agent e fare clic su Avvia .

Dopo l'avvio dell'agente, possiamo creare i lavori dell'agente di SQL Server.

Come accennato, creeremo un processo SQL per generare un backup di AdventureWorks2017 Banca dati. Per questo, eseguiamo il comando seguente utilizzando SQL Server Agent.

N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'

Per creare un nuovo processo SQL denominato Backup completo giornaliero eseguire il seguente script:

USE [msdb] 
go 
DECLARE @jobId BINARY(16) 

EXEC msdb.dbo.Sp_add_job 
  @job_name=N'Daily Full Backup', 
  @enabled=1, 
  @notify_level_eventlog=0, 
  @notify_level_email=2, 
  @notify_level_page=2, 
  @delete_level=0, 
  @category_name=N'[Uncategorized (Local)]', 
  @owner_login_name=N'NISARG-PC\Nisarg', 
  @job_id = @jobId output 

SELECT @jobId 
go  

Eseguirà il lavoro sulla mia workstation locale. Pertanto, lo aggiungiamo al Job Server.

Esegui la seguente query:

EXEC msdb.dbo.Sp_add_jobserver 
  @job_name=N'Daily Full Backup', 
  @server_name = N'NISARG-PC' 
go 

La fase del lavoro esegue il database di backup comando. Per configurare la fase del lavoro, utilizzare il codice seguente:

USE [msdb] 
go 

EXEC msdb.dbo.Sp_add_jobstep 
  @job_name=N'Daily Full Backup', 
  @step_name=N'Generate Backup', 
  @step_id=1, 
  @cmdexec_success_code=0, 
  @on_success_action=1, 
  @on_fail_action=2, 
  @retry_attempts=0, 
  @retry_interval=0, 
  @os_run_priority=0, 
  @subsystem=N'TSQL', 
  @command= 
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression' 
, 
@database_name=N'master', 
@flags=0 
go 

Il processo SQL verrà eseguito ogni giorno all'01:00. Per configurare la pianificazione, utilizzare il seguente codice:

USE [msdb] 
go 

DECLARE @schedule_id INT 

EXEC msdb.dbo.Sp_add_jobschedule 
  @job_name=N'Daily Full Backup', 
  @name=N'Run Backup At', 
  @enabled=1, 
  @freq_type=4, 
  @freq_interval=1, 
  @freq_subday_type=1, 
  @freq_subday_interval=0, 
  @freq_relative_interval=0, 
  @freq_recurrence_factor=1, 
  @active_start_date=20200918, 
  @active_end_date=99991231, 
  @active_start_time=10000, 
  @active_end_time=235959, 
  @schedule_id = @schedule_id output 

SELECT @schedule_id 

go 

L'intero codice del lavoro è il seguente:

USE [msdb] 
go 

DECLARE @jobId BINARY(16) 

EXEC msdb.dbo.Sp_add_job 
  @job_name=N'Daily Full Backup', 
  @enabled=1, 
  @notify_level_eventlog=0, 
  @notify_level_email=2, 
  @notify_level_page=2, 
  @delete_level=0, 
  @category_name=N'[Uncategorized (Local)]', 
  @owner_login_name=N'NISARG-PC\Nisarg', 
  @job_id = @jobId output 

SELECT @jobId 
go 


EXEC msdb.dbo.Sp_add_jobserver 
  @job_name=N'Daily Full Backup', 
  @server_name = N'NISARG-PC' 

go 

USE [msdb] 
go 
EXEC msdb.dbo.Sp_add_jobstep 
  @job_name=N'Daily Full Backup', 
  @step_name=N'Generate Backup', 
  @step_id=1, 
  @cmdexec_success_code=0, 
  @on_success_action=1, 
  @on_fail_action=2, 
  @retry_attempts=0, 
  @retry_interval=0, 
  @os_run_priority=0, 
  @subsystem=N'TSQL', 
  @command= 
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression' 
, 
@database_name=N'master', 
@flags=0 
go 

USE [msdb] 
go 

DECLARE @schedule_id INT 

EXEC msdb.dbo.Sp_add_jobschedule 
  @job_name=N'Daily Full Backup', 
  @name=N'Run Backup At', 
  @enabled=1, 
  @freq_type=4, 
  @freq_interval=1, 
  @freq_subday_type=1, 
  @freq_subday_interval=0, 
  @freq_relative_interval=0, 
  @freq_recurrence_factor=1, 
  @active_start_date=20200918, 
  @active_end_date=99991231, 
  @active_start_time=10000, 
  @active_end_time=235959, 
  @schedule_id = @schedule_id output 

SELECT @schedule_id 
go 

Eseguiamo prima il lavoro manualmente per la dimostrazione, eseguendo il codice seguente:

use msdb
go
exec sp_start_job 'Daily Full Backup'

È possibile visualizzare lo stato del lavoro eseguendo la seguente query:

SELECT  NAME 
             AS [Job Name], 
             CONVERT(VARCHAR, Dateadd(s, ( run_time / 10000 ) * 60 * 60 
                                         
                                         + ( ( run_time - ( run_time / 10000 ) * 
                                                          10000 ) / 
                                             100 ) * 60 
                                         
                                         + ( run_time - ( run_time / 100 ) * 100 
                                           ), CONVERT(DATETIME, Rtrim(run_date), 113)), 100) 
             AS 
             [Job Executed Date and Time], 
             CASE 
               WHEN enabled = 1 THEN 'Enabled' 
               ELSE 'Disabled' 
             END 
             [Job Status], 
             CASE 
               WHEN JobHistory.run_status = 0 THEN 'Failed' 
               WHEN JobHistory.run_status = 1 THEN 'Succeeded' 
               WHEN JobHistory.run_status = 2 THEN 'Retry' 
               WHEN JobHistory.run_status = 3 THEN 'Cancelled' 
               ELSE 'Unknown' 
             END 
             [Job Outcome] 
FROM   sysjobhistory JobHistory 
       JOIN sysjobs Jobs 
         ON JobHistory.job_id = Jobs.job_id 
WHERE  NAME = 'Daily Full Backup' 

Uscita:

Per visualizzare il file di backup, apri C:\Backup posizione:

Come puoi vedere, il file di backup è stato creato.