msdb.dbo.sysjobhistory 테이블을 1 분마다 (또는 자주 원하는 경우) 확인하는 작업을 만들 수 있습니다. 단일 인스턴스 실패에 대한 메시지를 한 번만 보내도록 큐 테이블을 구현할 수 있습니다.
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)
);
따라서 작업 일정을 잡을 수있는 코드는 다음과 같습니다.
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
);
이제 각 실패에 대해 개별 전자 메일을 보내려고한다고 가정하므로이 작업은 작업의 일부일 수도 있고 반드시 다른 작업의 일부일 수도 있습니다.
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;
다른 옵션들도 있습니다 :
- sysjobhistory.message를 가져옵니다.
- 실패한 개별 단계를 살펴보십시오
- 여러 번의 실패가 있더라도 n 분 / 시간에 한 번만 작업에 대한 메시지를 보냅니다.
- 각 실패에 대한 이메일 대신 실패한 모든 작업 목록이 포함 된 단일 이메일을 보냅니다.
- 작업이 실제로 실패한시기를 정확하게 측정 할 수있을만큼 전자 우편을 빨리 보내거나받지 못할 수 있으므로 메시지에 run_date 및 run_time을 포함 시키려고 할 수 있습니다 (끔찍한 데이터 유형 선택으로 인해 여기에 포함시키지 않았습니다) 왕실의 PITA를 형식화하십시오)
- 시간이 지나면 오래된 행을 정리하고 싶을 수도 있으므로 제거 명령도 필요할 수 있습니다.
데이터베이스 메일이 아직 설정되지 않은 경우이 학습서 를 참조하십시오 .
써드 파티 툴 (예 : SQL Sentry Event Manager )을 사용하여 훨씬 간단하게 만들 수 있습니다. 전체 공개 : 저는 SQL Sentry에서 일합니다.
AND EXISTS
부분을 제거 할 수 있습니다INSERT/SELECT
. 그리고 아마도 이름ReportServerJob_FailQueue
을 좀 더 일반적인 것으로 바꾸십시오 . :-)