2016-10-07 2 views
1

Je dois désactiver tous les travaux exécutés sur un serveur. J'ai couru le code suivant:Les tâches SQL Server Agent s'exécutent même si j'ai désactivé la planification dans le script

declare @t table (schedule_id int, [name] varchar(300)) 

    update msdb.dbo.sysschedules 
      set enabled = 0 
    output inserted.schedule_id, inserted.name into @t 
    from msdb.dbo.sysjobs j 


    join msdb.dbo.sysjobschedules js 
    on j.job_id = js.job_id 
    join msdb.dbo.sysschedules s 
    on js.schedule_id = s.schedule_id 
    where j.[name] not like 'DB -%' and j.[name] not like 'sys%' and j.[name] not like 'Maintenance%' 

    select * from @t 

Quand je vérifie un emploi donné et son programme associé, soit à partir de l'interface graphique Agent SQL ou via SQL, je peux voir l'horaire est désactivé. Toutefois, les travaux sont toujours en cours d'exécution et je peux voir les prochaines dates d'exécution dans le futur si je consulte msdb.dbo.sysjobschedules. Les seules choses que j'ai vues en ligne suggèrent qu'il y a un thread de fond qui doit être rafraîchi pour prendre ce changement? Et ce faisant, j'ai besoin de lancer sp_sqlagent_refresh_job (n'a pas aidé), ou redémarrer le serveur.

Je peux redémarrer le serveur, mais je suis curieux de savoir si quelqu'un d'autre a vu ce comportement, connaît la cause, sait comment le réparer d'une autre manière.

Répondre

1

Pourquoi vous embêtez-vous avec les horaires? Utilisez sp_update_job avec SQL dynamique pour désactiver tous les travaux:

DECLARE @sql nvarchar(max) 

;WITH cte AS (
SELECT j.job_id, 
     j.[name] 
FROM msdb.dbo.sysjobs j 
WHERE j.[name] not like 'DB -%' 
    and j.[name] not like 'sys%' 
    and j.[name] not like 'Maintenance%' 
) 

SELECT @sql = (
    SELECT 'EXEC msdb.dbo.sp_update_job @job_id = '''+CAST(job_id as nvarchar(max))+''', @enabled = 0;'+CHAR(10) 
    FROM cte 
    FOR XML PATH('') 
) 

EXEC sp_executesql @sql 

Si vous PRINT @sql avant EXEC vous verrez requête générée:

EXEC msdb.dbo.sp_update_job @job_id = 'CCCF8FC0-FCD4-4260-9A48-518AF5826297', @enabled = 0; 
EXEC msdb.dbo.sp_update_job @job_id = '48BB41E6-6BEC-452B-8D42-760AECDBB808', @enabled = 0; 

Si vous avez besoin d'arrêter emplois utilisent sp_stop_job.

+0

C'est une bonne solution, merci. Je suis surtout curieux de savoir ce que j'ai manqué qui fait que les horaires continuent à courir. Je me demande si j'ai effacé les prochaines dates d'exécution de msdb.dbo.sysjobschedules, cela le ferait? – Quicksilver

+0

Vous étiez sur la bonne voie, il y a une note à propos de cette table: elle rafraîchit toutes les 20 minutes. Donc, si vous avez désactivé les plannings dans sysschedules, les sysjobschedules seront actualisés dans les 20 prochaines minutes, vous ne pourrez donc pas voir les plannings des jobs changer immédiatement. – gofr1

+0

Et même si vous désactivez les planifications, les tâches démarrées plus tôt seront exécutées. Pour les arrêter, utilisez sp_stop_job. – gofr1