Alerty agenta programu SQL Server i błędy ważności

Sep 29 2020

Mam konfiguracji powiadomień w SQL Agent dla błędów poziom dotkliwości 15-16 do testowania, i okazało się, że nie zawsze są wyzwalane
Aby być bardziej dokładny, to wydaje się tylko wtedy, gdy spust podano numer błędu is_event_logged = 1wsys.messages

Oznacza to, że gdy uruchamiane są poniższe polecenia:

create table  -- Msg 102,  Level 15, State 1  -- Incorrect syntax near 'table'
select 1/0    -- Msg 8134, Level 16, State 1  -- Divide by zero error encountered

Te błędy (102, 8134) mają is_event_logged = 0i nie są zapisywane w dzienniku aplikacji -> alerty dla błędów ważności poziomów 15-16 nie są uruchamiane

Kiedy próbuję wygenerować błąd o sile 15 lub 16, czyli is_event_logged = 1, alerty są uruchamiane poprawnie

raiserror(18054,16,1)
raiserror(15716,15,1)

To samo z błędami o wadze 17-25, tylko te, które mają is_event_logged = 1, mogą wywołać alert

Pytania:

  1. Wydaje się, że nie poziom ważności błędu, ale w rzeczywistości is_event_loggedkolumna kontroluje, czy błąd może wyzwolić alert, który szuka błędów poziomu ważności? Czy to zamierzone zachowanie w programie SQL Server?

  2. Jeśli muszę utworzyć niestandardowy komunikat o błędzie jako alert dla aplikacji, używając sp_addmessageprocedury, a później skonfigurować alert dla tego komunikatu o błędzie, parametr @severity nie ma tak naprawdę znaczenia, muszę użyć parametru @with_log?

  3. Czy istnieje sposób na popełnienie WSZYSTKICH błędów o podanych poziomach ważności (15,16,17-25) w celu uruchomienia alertu, niezależnie od tego, czy is_event_logged wynosi 1 lub 0? Boję się przegapić coś ważnego, ponieważ istnieje wiele błędów wagi 17-25, które nie są rejestrowane w app.log -> nie wysyłaj e-maila z ostrzeżeniem?

Odpowiedzi

1 AMtwo Sep 29 2020 at 18:12

Tak, to działa zgodnie z projektem.

Patrząc na dokumenty :

SQL Server Agent czyta dziennik aplikacji i porównuje zapisane tam zdarzenia z alertami, które zdefiniowałeś.

Mechanizm używany do alertowania agenta SQL polega na odczytywaniu dziennika. Tak więc, jeśli nie jest zarejestrowany, nie ma alertu.

Zamiast tego można użyć zdarzeń rozszerzonych do przechwytywania błędów, nawet jeśli nie są one rejestrowane. Następnie możesz napisać własny proces odczytywania pliku Extended Events i wysyłania alertów w razie potrzeby.