Le Contexte

Sql Server Express (2005 ou 2008) est un très bon outil pour stocker des données dans un périmètre restreint. Le fait de pouvoir embarquer une base dans une application et la monter sur une instance utilisateur à la volée est très pratique aussi. De plus depuis qu’il est livré avec un Sql Server Management Studio Express, cela devient presque un environnement de développement suffisant à la plupart des tâches.

Néanmoins, il s’agit d’un outil gratuit et par là même limité par rapport aux versions payantes de Sql Server. Même dans l’optique où l’on ne fait qu’une utilisation de stockage basique des données, il est presque irréaliste d’imaginer que l’on n’aura jamais besoin à un moment ou un autre d’effectuer des tâches récurrentes sur la base que ce soit pour des besoins métiers (comme réinitialiser des valeurs en début de mois par exemple) ou techniques (mettre en place un plan de sauvegarde). 

Sur toutes les versions de Sql Server en dehors des versions Express depuis longtemps, il y a une appli pour ça (traumatisé par Apple moi?). Il s’agit du Sql Server Agent qui est un service qui tourne en parallèle du process Sql Server et qui est dédié à la planification de tâches. Son avantage est d’être pleinement intégré à Sql Server, d’avoir accès à tout un contexte d’exécution en direct et les mécanismes de sécurité de de log qui vont avec.

Si pour vos besoins vous n’avez que Sql Server Express, il y a plusieurs moyens de contourner le problème. Voici quelques solution qui me viennent à l’esprit:

  • Lancement de commandes Sql par le biais des tâches planifiées de Windows
  • Ecriture d’un service dédié avec son propre timer, contexte,etc…
  • Mise en place de Jobs au sein même de Sql Server Express au travers du Sql Server Service Broker (qui lui fait partie de Sql Server Express…)

 

Nous allons voir ici la plus simple et la plus rapide, à savoir utiliser directement les tâches planifiées de Windows.

 

Jobs par tâches planifiées de Windows

 

Prenons un scénario simple d’une procédure de backup à réaliser toutes les nuits à 2h du matin.

 

Procédure Stockée de l’opération

Pour plus de souplesse créons une procédure stockée qui contiendra l’ensemble des tâches à accomplir:

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name='ToolBox')
	EXEC sp_executesql N'CREATE DATABASE ToolBox'
GO

USE Toolbox
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id=OBJECT_ID('BackupDB'))
	DROP PROCEDURE BackupDB
GO

CREATE PROCEDURE BackupDB @dbname sysname --NVARCHAR(255)
AS
BEGIN
	DECLARE @DateTag NVARCHAR(32), @BackupFile NVARCHAR(255)

	SET @DateTag =	'_' + CAST(YEAR(GETDATE()) AS NVARCHAR(4)) +
					'_' + CAST(MONTH(GETDATE()) AS NVARCHAR(4)) +
					'_' + CAST(DAY(GETDATE()) AS NVARCHAR(4))

	SET @BackupFile = 'C:\Data\Backup\' + CAST(@dbname as NVARCHAR(255)) +	@DateTag + '.bak'

	BACKUP DATABASE @dbname TO DISK=@BackupFile
END
GO
--EXEC BackupDB 'mabase'

 

Il n’y a rien de particulier dans ce script qui est fait à minima pour l’exemple. Indépendamment des tâches qu’il faudrait effectuer pour sécuriser le script, nettoyer les fichiers, nettoyer la base,etc…, nous passerons quand même par une base de travail (ToolBox) pour stocker notre (nos) script(s).

 

Création du batch

Les tâches planifiées de Windows permettent bien sur de rentrer directement n’importe quelle commande, néanmoins, il est plus simple de créer au moins un petit programme de lancement sous forme de fichier .bat pour plus de souplesse (si vous avez des évolutions à faire dans vos commandes, il est plus simple de modifier ou scripter le texte du .bat qu’une commande de tâche planifiée même si celle-ci reste accessible par script)

Pour cela nous utiliserons bien sur SQLCMD qui nous permet de nous connecter à une instance Sql Server et de lancer une ou plusieurs commandes tsql par un script.

Voici donc notre commande (encore une fois à minima ;-) :

sqlcmd -S .\SQLEXPRESS -Q "exec ToolBox.dbo.BackupDB mabase" -o "C:\Data\jobs\joblog.txt"

 

Création du Job

 

Ouvrez le gestionnaire de tâches planifiées de Windows (outils d’administration dans le panneau de configuration):

image

Puis ajoutez une nouvelle tâche de base:

image

Définissez ensuite un déclancheur quotidien:

image

Définissez votre heure et la récurrence:

image

Définissez enfin l’action, il s’agit ici de démarrer un programme:

image

image

Puis sauvegardez le tout après le récapitulatif de la dernière étape du wizard.

Votre tâche est maintenant effective et disponible mais il reste un dernier détail à régler. En effet, la tâche s’enregistre avec les droits de celui qui l’a créer et par défaut ne peut s’éxécuter que si celui-ci est connecté. Nous allons donc changer cela en sélectionnant notre tâche dans la liste des tâches et en cliquant sur [propriétés]:

image

 

Sauvergardez le tout et lancez la tache manuellement pour la tester à travers le bouton Run/Lancer de la barre d’actions:

image

 

Et voila ;-)

Nous verrons une prochaine fois comment programmer le Sql Server Broker pour avoir un système entièrement intégré à notre base.

En attendant, bons Sql Express Jobs!