bir iş kategorisindeki herhangi bir iş başarısız olduğunda uyar


11

SQL Server 2008'de belirli bir kategorideki bir iş başarısız olduğunda e-posta gönderecek bir uyarı ayarlamak mümkün müdür?

Merak ediyorum, bir SSRS aboneliği başarısız olduğunda her zaman bir e-posta ayarlamak istiyorum - ve bu aboneliklerin tümü Report Server kategorisindeki işler .

DÜZENLEME - bu bir SSRS abonelik başarısız olduğunda, iş kendisini çıkıyor gelmez benim sorum SSRS abonelik izleme kullanım için geçerli olmayacaktır böylece başarısız. Yine de çevremizde yürüttüğümüz diğer işler için bilmek istiyorum


Bir adım en azından başarısız olur mu? Aşağıdaki cevabım 'Rapor Sunucusu' kategorisindeki işlere bakar, ancak tüm işleri istiyorsanız sadece bu AND EXISTSbölümü kaldırabilirsiniz INSERT/SELECT. Ve muhtemelen adı ReportServerJob_FailQueuedaha genel bir şeyle değiştirin . :-)
Aaron Bertrand

Ne yazık ki, hiçbir adım başarısız - ama başka bir izleme mekanizması ile gelebilir eminim!
JHFB

Yanıtlar:


10

Msdb.dbo.sysjobhistory tablosunu her dakika (veya istediğiniz sıklıkta) denetleyen bir iş oluşturabilirsiniz. Bir sıra tablosunu uygulamak isteyebilirsiniz, böylece iletiyi tek bir örnek hatası için yalnızca bir kez gönderebilirsiniz.

USE msdb;
GO

CREATE TABLE dbo.ReportServerJob_FailQueue
(
  job_id UNIQUEIDENTIFIER,
  run_date INT,
  run_time INT, -- horrible schema, just matching sysjobhistory
  sql_message_id INT,
  sent BIT NOT NULL DEFAULT 0,
  PRIMARY KEY (job_id, run_date, run_time)
);

Böylece bir işte zamanlayabileceğiniz kodunuz:

INSERT dbo.ReportServerJob_FailQueue
  (job_id, run_date, run_time, sql_message_id)
SELECT job_id, run_date, run_time, sql_message_id
FROM msdb.dbo.sysjobhistory AS h
WHERE step_id = 0 
AND run_status = 0
AND EXISTS 
(
  SELECT 1 FROM msdb.dbo.sysjobs AS j
    INNER JOIN msdb.dbo.syscategories AS c
    ON j.category_id = c.category_id
    WHERE j.job_id = h.job_id
   AND c.name = 'Report Server'
)
AND NOT EXISTS 
(
  SELECT 1 FROM dbo.ReportServerJob_FailQueue
    WHERE job_id = h.job_id
    AND run_date = h.run_date
    AND run_time = h.run_time
);

Şimdi, her başarısızlık için ayrı bir e-posta göndermek istediğinizi varsayalım, bu da işin bir parçası olabilir (veya farklı bir işin parçası olabilir, ancak bu akıllıca olmasa da):

DECLARE 
  @subject NVARCHAR(4000),
  @body NVARCHAR(4000),
  @name SYSNAME,
  @id UNIQUEIDENTIFIER,
  @date INT,
  @time INT,
  @msg INT;

DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT q.job_id, q.run_date, q.run_time, q.sql_message_id, j.name
  FROM dbo.ReportServerJob_FailQueue AS q
  INNER JOIN msdb.dbo.sysjobs AS j
  ON q.job_id = j.job_id
  WHERE q.sent = 0;

OPEN c;

FETCH NEXT FROM c INTO @id, @date, @time, @msg, @name;

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @subject = 'Report Server job ' + @name + ' failed.';
  SET @body = 'Error number: ' + RTRIM(@msg);

  BEGIN TRY
    EXEC msdb.dbo.sp_send_dbmail 
      @profile_name = 'default',     -- you may need to change this
      @recipients   = 'foo@bar.com', -- you will need to change this
      @subject      = @subject,
      @body         = @body;

    UPDATE dbo.ReportServerJob_FailQueue
      SET sent = 1 
      WHERE job_id = @id
      AND run_date = @date
      AND run_time = @time;
  END TRY
  BEGIN CATCH
    PRINT 'Will have to try that one again later.';
  END

  FETCH NEXT FROM c INTO @id, @date, @time, @msg, @name;
END

CLOSE c; DEALLOCATE c;

Başka seçenekler de var:

  • sysjobhistory.message çekin
  • başarısız olan bireysel adımlara bak
  • birden fazla arıza olsa bile herhangi bir iş için yalnızca n dakika / saatte bir mesaj gönderin
  • her başarısızlık için e-posta yerine başarısız olan tüm işlerin listesini içeren tek bir e-posta gönderme
  • E-posta, işin gerçekten başarısız olduğu zamanın doğru bir ölçüsü olacak kadar hızlı bir şekilde gönderilemeyeceği veya alınamayacağı için iletiye run_date ve run_time öğelerini dahil etmek isteyebilirsiniz (korkunç veri türü seçimleri nedeniyle buraya dahil etmedim biçimlendirmeyi kraliyet PITA yapın)
  • bir süre sonra muhtemelen eski satırları temizlemek isteyeceksiniz, bu nedenle bir temizleme komutu da istenebilir

Veritabanı Postası henüz ayarlanmamışsa, lütfen bu eğiticiye bakın .

Ayrıca , bunların çoğunu daha basit hale getirecek 3. taraf araçlarını da (örneğin SQL Sentry Event Manager ) kullanabilirsiniz. Tam açıklama: SQL Sentry için çalışıyorum.


0

Düzenlemenize dayanarak, bu yalnızca Aaron'un SSRS abonelik hatalarıyla ilgili yanıtının bir uzantısı olacaktır (sadece SQL Agent işi değil). İş izleme işine bir adım eklemenizi öneririm, yoksa bunu tamamen ayrı bir iş olarak yapabilirsiniz.

Abonelik durumunu almak için ReportServer.dbo.ExecutionLog3 görünümü kontrol etmeniz yeterlidir . StatusSütun şey ama gösterecektir rsSuccessbaşarısızlıkları üzerinde. Sadece filtrelemek için RequestType = 'Subscription'. Biraz zaman kontrolü eklemek isteyeceksiniz, böylece her seferinde tüm kayıtları kontrol etmeyeceksiniz. İşi 15 dakikada bir çalıştırırsanız TimeStart, son 15 dakikada bir kontrol edin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.