SQL Server Agent est un composant utilisé pour l'automatisation des tâches de base de données. Par exemple, nous devons effectuer la maintenance de l'index sur les serveurs de production uniquement pendant les heures non ouvrables. Nous créons donc une tâche SQL Server d'exécution de la maintenance de l'index et la planifions pour les heures "hors".
Lorsque nous installons SQL Server, le service SQL Server Agent est désactivé. Tout d'abord, nous l'activons et le démarrons manuellement. Ensuite, nous configurons le travail SQL Server, en utilisant SQL Server Management Studio et les procédures stockées système de la base de données MSDB.
Cet article explique comment créer un Job SQL Server à l'aide des procédures stockées système de la base de données MSDB.
Les procédures stockées système de la base de données MSDB
SQL Server utilise les suivants :
- sp_add_job :la procédure consiste à créer un nouveau travail. S'il réussit, il renvoie @job_id. Les arguments suivants sont applicables :
- @job_name :il s'agit d'un nom de travail unique.
- @enabled :la tâche est activée ou désactivée. Une fois qu'une tâche est créée, vous pouvez définir la valeur du paramètre sur 1 pour activer la tâche.
- @notify_level_eventlog :ce paramètre est utilisé pour écrire l'état de la tâche SQL dans l'observateur d'événements Windows.
Valeur | Description |
0 | Le résultat de la tâche ne sera pas écrit dans le journal des événements. |
1 | Si la tâche s'exécute avec succès, le résultat sera écrit dans l'observateur d'événements |
2 (valeur par défaut) | Si la tâche échoue, le résultat et le message d'erreur seront écrits dans l'observateur d'événements |
3 | Le résultat de la tâche est écrit dans l'observateur d'événements. |
- @notify_level_email :ce paramètre sert à envoyer l'e-mail concernant le résultat de la tâche SQL. Les valeurs valides du paramètre sont les mêmes que les valeurs de l'argument @notify_level_eventlog.
- @notify_level_page :ce paramètre sert à envoyer la notification au téléavertisseur du résultat de la tâche SQL. Les valeurs valides des paramètres sont les mêmes que les valeurs de l'argument @notify_level_eventlog.
- @delete_level :ce paramètre sert à supprimer le travail une fois terminé. Dans ce cas, la valeur du paramètre doit être 1. Notez que la valeur par défaut est 0; ensuite, il ne supprimera pas le travail une fois terminé.
- @category_level :ce paramètre indique les valeurs de la catégorie de travail. La valeur par défaut est NULL.
- @owner_login_name :la valeur est le nom de domaine ou le nom de connexion SQL du propriétaire de la tâche.
2. Sp_add_jobserver : Cette procédure stockée sert à spécifier le serveur cible pour l'exécution du Job SQL. La procédure accepte les arguments suivants :
- @job_id :il s'agit d'un UNIQUEIDENTIFIER du travail SQL. La valeur par défaut de cet argument est NULL.
- @job_name :c'est le nom du Job SQL.
- @server_name :il s'agit du nom du serveur sur lequel vous souhaitez exécuter le Job SQL. La valeur d'argument par défaut peut être le serveur local (LOCAL) ou le nom d'hôte du serveur cible.
- @job_name :nom de la tâche dans laquelle vous ajoutez l'étape. C'est un SYSNAME avec NULL comme valeur par défaut.
- @step_name :le nom de l'étape. C'est un SYSNAME avec NULL comme valeur par défaut.
- @step_id :l'ID séquentiel de l'étape de travail. Il s'agit d'un nombre incrémental sans espace. C'est une valeur INT, et la valeur par défaut est NULL.
- @cmdexec_success_code :cette valeur est renvoyée par le sous-système CmdExec. Il indique si l'exécution de la commande a réussi. Le code est une valeur int avec 0 comme valeur par défaut.
- @on_sucess_action :cette valeur indique l'action qui doit être effectuée une fois l'étape de travail terminée avec succès. Les valeurs peuvent être l'une des suivantes :
Valeur | Description |
1 | Quittez le travail et retournez le succès |
2 | Quitter le travail et revenir a échoué |
3 | Aller à l'étape suivante du travail |
4 | Accédez à l'identifiant de l'étape on_success_step_id |
- @on_fail_action :spécifiez l'action à effectuer si les étapes de la tâche échouent. C'est une valeur INT, et la valeur par défaut est NULL.
- @retry_attempt :spécifiez le nombre de nouvelles tentatives après l'échec de l'étape de travail. C'est une valeur INT, et la valeur par défaut est NULL.
- @retry_interval :définit l'intervalle de temps (minutes) entre deux tentatives d'échec d'étape de travail SQL. C'est une valeur INT, et la valeur par défaut est NULL.
- @os_run_priority :
- @Subsystem :spécifiez le nom du sous-système utilisé par l'Agent SQL Server pour exécuter la commande. Les valeurs valides sont les suivantes :
Valeur du sous-système | Description |
CmdExec | Commande du système d'exploitation ou le fichier exécutable (*.exe,*.bat) |
ANALYSISQUERY | Requêtes du service d'analyse SQL Server, par exemple, MDX, DMX. |
ANALYSISQUERY | Commande du service d'analyse SQL Server, par exemple, XMLA. |
SSIS | Package de services d'intégration SQL Server. |
PowerShell | Commande ou script PowerShell. |
T-SQL | Requête T-SQL ou procédure stockée |
Répartition | Agent distributeur de réplication SQL Server. |
Instantané | Agent d'instantané de réplication SQL Server. |
Lecteur de journaux | Agent de lecture du journal de réplication SQL Server. |
Lecteur de file d'attente | Lecteur de file d'attente de réplication SQL Server. |
- @command :spécifiez la commande que le service de l'Agent SQL Server doit exécuter via le sous-système. Le type de données est varchar(max) et la valeur par défaut est NULL.
- @Database_name :spécifiez le nom de la base de données sur laquelle vous souhaitez exécuter la commande. Ce paramètre est utile lorsque vous exécutez un script T-SQL à l'aide de l'Agent SQL Server.
4. Sp_add_jobschedule : la procédure stockée sert à créer le planning du Job SQL. Cette procédure utilise les arguments suivants :
- @job_name :spécifiez le nom du Job SQL. La planification sera faite pour le travail SQL spécifié dans l'argument @job_name.
- @name :le nom de l'horaire. Le type de données est varchar et la valeur par défaut est NULL.
- @enabled :définissez 1 pour activer la planification ou 0 pour désactiver la planification.
- @freq_type :indique l'heure d'exécution de la tâche SQL. Le type de données du paramètre est INT et la valeur par défaut est 0. Les valeurs valides sont les suivantes :
Valeur | Description |
1 | La tâche ne sera exécutée qu'une seule fois. |
4 | Tous les jours. |
8 | Hebdomadaire |
16 | Mensuel |
64 | Exécuter la tâche au démarrage du service SQL Server Agent |
128 | Exécutez la tâche SQL lorsque le serveur est inactif. |
- @freq_interval :indique le jour d'exécution de la tâche SQL. Le type de données est INT et la valeur par défaut est 0. La valeur dépend de la valeur spécifiée dans le paramètre @freq_type. Les valeurs valides sont l'une des suivantes :
Valeur | Effet sur le calendrier de la tâche |
1 (une fois) | Le @Freq_interval ne sera pas utilisé. |
4 (quotidien) | Chaque @freq_interval jours |
8 | La valeur de @Freq_interval peut être l'une des valeurs suivantes : 1 =dimanche 2 =lundi 4 =mardi 8 =mercredi 16 =jeudi 32 =vendredi 64 =samedi |
16 | Exécutez la tâche sur @Freq_interval jour du mois |
64 | Le @Freq_interval ne sera pas utilisé |
128 | Le @Freq_interval ne sera pas utilisé |
- @freq_subday_type :spécifiez l'unité de freq_subday_interval. Le type de données est INT et la valeur par défaut est NULL.
- @active_start_date :définissez la date à laquelle vous souhaitez démarrer l'exécution de la tâche. Le type de données est INT et n'a pas de valeur par défaut. Le format de date est AAAAMMJJ. La valeur doit être supérieure ou égale à 19900101.
- @active_end_date :spécifiez la date à laquelle arrêter l'exécution de la tâche. Le type de données est INT, sans valeur par défaut. Le format de date est AAAAMMJJ et la valeur doit être supérieure ou égale à 19900101.
- @active_start_time :spécifiez l'heure à laquelle vous souhaitez démarrer l'exécution de la tâche. Le type de données est INT, sans valeur par défaut. Le format de l'heure est HHMMSS.
- @active_end_time :indiquez l'heure à laquelle vous souhaitez arrêter l'exécution de la tâche. Le type de données est INT, sans valeur par défaut. Le format de l'heure est HHMMSS.
Code T-SQL pour créer une tâche SQL
Pour illustrer les processus, nous utilisons le SQL Server 2019 sur le poste de travail avec le AdventureWorks2017 base de données, restaurée à partir d'une sauvegarde. Nous créons une tâche SQL nommée Sauvegarde complète quotidienne – il génère une sauvegarde de AdventureWorks2017 base de données et la copie sur C:\Backups emplacement.
Tout d'abord, nous devons activer les agents XP. C'est une option avancée. Par conséquent, nous activons d'abord l'option de configuration avancée et le composant Agent XPs.
Pour ce faire, exécutez la requête suivante :
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Une fois l'Agent activé, nous démarrons le service Agent.
Ouvrez SQL Server Management Studio et connectez-vous à l'instance SQL Server. Ensuite, faites un clic droit sur SQL Server Agent et cliquez sur Démarrer .
Après le démarrage de l'agent, nous pouvons créer les travaux de l'agent SQL Server.
Comme mentionné, nous allons créer une tâche SQL pour générer une sauvegarde de AdventureWorks2017 base de données. Pour cela, nous exécutons la commande suivante à l'aide de SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Pour créer une nouvelle tâche SQL nommée Sauvegarde complète quotidienne, exécutez le script suivant :
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
Il exécutera le travail sur mon poste de travail local. Ainsi, nous l'ajoutons au Job Server.
Exécutez la requête suivante :
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
L'étape de travail exécute la base de données de sauvegarde commande. Pour configurer l'étape de tâche, utilisez le code suivant :
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
Le travail SQL s'exécutera quotidiennement à 1h00. Pour configurer le planning, utilisez le code suivant :
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
Le code complet du travail est le suivant :
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
Nous exécutons d'abord le travail manuellement pour la démonstration, en exécutant le code ci-dessous :
use msdb
go
exec sp_start_job 'Daily Full Backup'
Vous pouvez afficher l'état de la tâche en exécutant la requête suivante :
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'
Sortie :
Pour afficher le fichier de sauvegarde, ouvrez le C:\Backups emplacement :
Comme vous pouvez le voir, le fichier de sauvegarde a été créé.