web-dev-qa-db-fra.com

Comment exécuter une procédure stockée chaque jour dans SQL Server Express Edition?

Comment est-il possible d'exécuter une procédure stockée à une heure donnée chaque jour dans SQL Server Express Edition?

Remarques:

  • Ceci est nécessaire pour tronquer une table d'audit
  • Une alternative serait de modifier la requête d'insertion mais cela est probablement moins efficace
  • SQL Server Express Edition ne possède pas l'agent SQL Server

Questions connexes:

24
Thomas Bratt

SQL Server Express n'étant pas fourni avec SQL Agent, vous pouvez utiliser le planificateur Windows pour exécuter un SQLCMD avec un proc ou un script SQL stocké.

http://msdn.Microsoft.com/en-us/library/ms162773.aspx

24
Raj More

J'ai trouvé le mécanisme suivant a fonctionné pour moi.

USE Master
GO

IF  EXISTS( SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(N'[dbo].[MyBackgroundTask]')
            AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[MyBackgroundTask]
GO

CREATE PROCEDURE MyBackgroundTask
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- The interval between cleanup attempts
    declare @timeToRun nvarchar(50)
    set @timeToRun = '03:33:33'

    while 1 = 1
    begin
        waitfor time @timeToRun
        begin
            execute [MyDatabaseName].[dbo].[MyDatabaseStoredProcedure];
        end
    end
END
GO

-- Run the procedure when the master database starts.
sp_procoption    @ProcName = 'MyBackgroundTask',
                @OptionName = 'startup',
                @OptionValue = 'on'
GO

Quelques notes:

  • Il est utile d'écrire une entrée d'audit quelque part pour que vous puissiez voir que la requête a bien été exécutée.
  • Le serveur doit être redémarré une fois pour que le script soit exécuté la première fois.
8
Thomas Bratt

Créez une tâche planifiée qui appelle "C:\YourDirNameHere\TaskScript.vbs" au démarrage. VBScript doit exécuter des tâches répétées (dans cet exemple, il s’agit d’une boucle de 15 minutes)

Via la ligne de commande (doit exécuter cmd.exe en tant qu'administrateur):

schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP

Exemple TaskScript.vbs: Ceci exécute votre script SQL personnalisé en mode silencieux à l'aide de RunSQLScript.bat

Do While 1
    WScript.Sleep(60000*15)
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.RUN "cmd /c C:\YourDirNameHere\RunSQLScript.bat C:\YourDirNameHere\Some_TSQL_Script.sql", 0
Loop

RunSQLScript.bat: Ceci utilise sqlcmd pour appeler l'instance de base de données et exécuter le script SQL

@echo off
sqlcmd -S .\SQLEXPRESS -i %1
4
VoteCoffee

Si vous utilisez Express Edition, vous devrez utiliser le planificateur Windows ou l'application qui se connecte au serveur d'une manière ou d'une autre.

Vous utiliseriez le planificateur pour exécuter sqlcmd. Voici quelques instructions pour que sqlcmd fonctionne avec l'édition express.

4
Yishai

SQL Scheduler à partir de http://www.lazycoding.com/products.aspx

  • Gratuit et simple
  • Prend en charge toutes les versions de SQL Server 2000, 2005 et 2008
  • Prend en charge un nombre illimité d'instances SQL Server avec un nombre illimité de travaux.
  • Permet de planifier facilement les tâches de maintenance de SQL Server: sauvegardes, reconstruction d'index, contrôles d'intégrité, etc.
  • Fonctionne en tant que service Windows 
  • Notifications par e-mail sur le succès et l'échec d'un travail 
2
Iman Abidi

Puisqu'une autre question similaire a été posée, et sera probablement fermée comme une copie de celle-ci, et il y a beaucoup d'options non mentionnées dans les réponses déjà présentes ici ...

Puisque vous utilisez SQL Express, vous ne pouvez pas utiliser SQL Server Agent. Cependant, il existe de nombreuses alternatives que vous pouvez planifier à l’aide de À ou Planificateur de tâches Windows en fonction de votre système d’exploitation:

Tous ces langages/outils (et beaucoup d’autres) ont la capacité de se connecter à SQL Server et d’exécuter une procédure stockée. Vous pouvez également essayer ces remplacements d’agent:

1
Aaron Bertrand

Le moyen le plus simple que j'ai trouvé pour résoudre ce problème est de créer une requête qui exécute la procédure stockée, puis enregistrez-la. La requête devrait ressembler à celle ci-dessous.

     use [database name]
     exec storedproc.sql

Créez ensuite un fichier de commandes contenant quelque chose de similaire au code ci-dessous.

sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql

Ensuite, demandez au planificateur de tâches d'exécuter le lot aussi souvent que vous le souhaitez.

1
BrianMichaels

Comme vous l'avez correctement noté, sans le processus d'agent, vous aurez besoin de quelque chose d'autre externe au serveur, par exemple un service que vous écrivez et installez ou un planificateur Windows.

Notez qu’avec une installation Express pour une application locale, il est possible que la machine ne soit pas allumée au moment où vous voulez tronquer la table (disons que vous la définissez pour la tronquer tous les soirs à minuit, mais l’utilisateur n’a jamais sa machine allumée. ).

Ainsi, votre tâche planifiée n'est jamais exécutée et votre journal d'audit devient incontrôlable (c'est également un problème avec SQL Server Agent, mais on pourrait supposer qu'un serveur réel fonctionnerait de manière non-stop). Une meilleure stratégie si cette situation correspond à la vôtre serait peut-être que l'application le fasse à la demande lorsqu'elle détecte qu'il s'est écoulé plus de X jours depuis la troncature ou quelle que soit votre opération.

Une autre chose à examiner est que si vous parlez d'une application Web, le chargement de l'application peut arriver, et l'opération peut être effectuée lorsque cet événement est déclenché.

Comme mentionné dans le commentaire, il existe sp_procoption - ceci pourrait permettre à votre SP de s'exécuter à chaque démarrage du moteur - les inconvénients de cette méthode sont que, pour les instances longues, il peut y avoir une longue le temps entre les appels et des problèmes subsistent si le moteur ne tourne pas au moment où vous souhaitez que l'opération soit effectuée.

0
Cade Roux

Une autre approche de la planification dans SQL Express consiste à utiliser Timers de conversation Service Broker . Pour exécuter périodiquement une procédure stockée que vous pouvez utiliser pour amorcer un planificateur personnalisé.

Voir par exemple Planification de travaux dans SQL Server Express

0

Notre société utilise également SQLEXPRESS et il n’existe aucun agent SQL.

Puisqu'il n'y a pas de réponse marquée comme "juste" et que toutes les solutions sont assez complexes, je vais partager ce que j'ai fait là-bas. Peut-être que c'est vraiment mauvais, mais cela a très bien fonctionné pour moi.

J'ai choisi les opérations d'insertion (les gens le font) sur une table dont le temps est proche de celui dont j'avais besoin et créé un déclencheur "ON INSERT" qui applique la fonction nécessaire.

0
KennyKivi

Vous pouvez utiliser le Planificateur de tâches pour lancer une application de console simple qui exécuterait l'instruction Sql. 

0
Craig Bart