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 à un moment précis chaque jour dans SQL Server Express Edition?
Notes:
- Ceci est nécessaire pour tronquer une table de vérification
- une alternative serait de modifier la requête insert mais c'est probablement moins efficace
- SQL Server Express Edition n'ont pas l'Agent SQL Server
Questions Connexes:
- Comment puis-je programmer une sauvegarde quotidienne avec SQl Server Express?
- exécution programmée de la procédure stockée sur le serveur SQL
10 réponses
puisque SQL Server express n'est pas fourni avec SQL Agent, vous pouvez utiliser Windows scheduler pour exécuter un SQLCMD avec un proc stocké ou un script SQL.
j'ai trouvé que le mécanisme suivant fonctionnait 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:
- cela vaut la peine d'écrire une entrée de vérification quelque part pour que vous puissiez voir que la requête a réellement fonctionné.
- le serveur doit redémarrer une fois pour s'assurer que le script tourne la première fois.
si vous utilisez Express Edition, vous devrez utiliser Windows Scheduler ou l'application se connectant au serveur d'une manière ou d'une autre.
vous utiliseriez le scheduler pour exécuter sqlcmd. voici quelques instructions pour faire fonctionner le sqlcmd avec express edition.
créer une tâche programmée qui appelle "C:\YourDirNameHere\TaskScript.vbs" au démarrage. VBScript devrait exécuter des tâches répétées (dans cet exemple, c'est 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 silence en utilisant RunSQLScript.MTD
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 le instance de la base de données et exécuter le script SQL
@echo off
sqlcmd -S .\SQLEXPRESS -i %1
Planificateur SQL à partir de http://www.lazycoding.com/products.aspx
- simple et Gratuit
- supporte toutes les versions de SQL Server 2000, 2005 et 2008
- prend en charge des instances de Serveur SQL illimitées avec un nombre illimité de tâches.
- permet de programmer facilement les tâches de maintenance du serveur SQL: sauvegardes, reconstructions d'index, vérifications d'intégrité, etc.
- fonctionne sous Windows Service
- notifications par Email sur l'emploi, la réussite et l'échec
Puisqu'une autre question semblable a été posée, et sera probablement fermée en tant que duplicata de celle-ci, et il y a de nombreuses options qui ne sont pas mentionnées dans les réponses déjà présentées ici...
puisque vous utilisez SQL Express, vous ne pouvez pas utiliser SQL Server Agent. Cependant, il existe de nombreuses alternatives, tous que vous pouvez programmer en utilisant à ou Windows Task Scheduler en fonction de votre système d'exploitation:
tous ces langages/outils (et beaucoup d'autres) ont la capacité de se connecter au serveur SQL et d'exécuter une procédure stockée. Vous pouvez également essayer ces agents remplacements:
la façon la plus facile que j'ai trouvé pour aborder cette question Est de créer une requête qui exécute la procédure stockée puis la sauvegarder. La requête devrait ressembler à celle ci-dessous.
use [database name]
exec storedproc.sql
crée alors un fichier batch avec quelque chose de similaire au code ci-dessous.
sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql
Alors le planificateur de tâches exécuter le lot aussi souvent que vous le souhaitez
vous pouvez utiliser le planificateur de tâches pour lancer une application de console simple qui exécuterait L'instruction Sql.
comme vous l'avez correctement noté, sans le processus agent, vous aurez besoin de quelque chose d'extérieur au serveur, peut-être un service que vous écrivez et installez ou Windows scheduler.
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 Réglez pour tronquer chaque nuit à minuit, mais l'utilisateur n'a jamais sa machine allumée).
donc votre la tâche programmée n'est jamais exécutée et votre journal d'audit devient hors de contrôle (c'est aussi un problème avec SQL Server Agent, mais on pourrait supposer qu'un vrai serveur serait en cours d'exécution sans arrêt). Une meilleure stratégie si cette situation correspond à la vôtre pourrait être d'avoir l'application le faire à la demande quand il détecte qu'il a été plus de X jours depuis la troncature ou quelle que soit votre opération est.
une autre chose à regarder est si vous parlez d'une Application Web, il pourrait y avoir du temps lorsque l'application est chargée, et l'opération peut être effectuée lorsque cet événement se déclenche.
comme mentionné dans le commentaire, il y a sp_procoption - cela pourrait permettre à votre SP de fonctionner chaque fois que le moteur est démarré - les inconvénients de cette méthode sont que pour les cas à long terme, il pourrait y avoir un long temps entre les appels, et il a toujours des problèmes si le moteur ne fonctionne pas aux moments où vous avez besoin de l'opération à faire.
notre société utilise également SQLEXPRESS et il n'y a pas D'Agent SQL.
Puisqu'il n'y a pas de réponse marquée comme "bon" et que toutes les solutions sont assez complexes, je vais partager ce que j'ai fait là-bas. C'est peut-être très mauvais, mais ça a bien marché pour moi.
j'ai choisi des opérations D'Insertion (les gens font) à une table qui a obtenu près de la même plage de temps que j'avais besoin et a fait un déclencheur" sur L'insertion " qui applique la fonction nécessaire.