- Zadanie opisuje nie tylko co ma się wykonać, ale też kiedy, pod jakim warunkiem i kogo powiadomić o wyniku.
- Harmonogram składa się z kilku niezależnych ustawień: cyklu, godziny, dni tygodnia oraz osobnych znaczników dla soboty i niedzieli.
- Kolumna
JEZELI_ZAPYTANIEpozwala uzależnić wykonanie od wyniku zapytania — zadanie działa tylko wtedy, gdy jest co robić. - Kolumna
OSTATNIOWYKONANOjest pierwszym miejscem do sprawdzenia, gdy zadanie przestało działać niezauważenie.
Do czego służy tabela [dbo].[_jobs]
Część pracy systemu odbywa się bez udziału człowieka: kopie zapasowe, raporty wysyłane rano na skrzynkę kierownika, kontrola stanów minimalnych, przygotowanie plików do wymiany z kontrahentem. Tabela [dbo].[_jobs] jest miejscem, w którym te czynności są zdefiniowane — razem z harmonogramem i regułami powiadamiania.
Definicja zadania jest bogatsza, niż mogłoby się wydawać. Poza typem czynności i harmonogramem obejmuje warunek uruchomienia: kolumna JEZELI_ZAPYTANIE mieści polecenie SELECT, którego wynik decyduje, czy zadanie ma się wykonać, oraz jaka treść trafi w powiadomieniu. Pozwala to zbudować kontrolę działającą na zasadzie wyjątku — wiadomość przychodzi tylko wtedy, gdy coś wymaga uwagi, a nie codziennie niezależnie od sytuacji.
Osobną grupę stanowią ustawienia dotyczące wyniku: format pliku raportu, katalog zapisu, katalog kopii oraz trzy adresy odbiorców — główny, do wiadomości i ukryty. Kolumna CONNECTIONSTRINGNAME pozwala skierować zadanie na inną bazę niż domyślna, co przydaje się przy raportach zbierających dane z kilku instalacji.
Rozdzielenie warunku od czynności pozwala budować kontrole działające na zasadzie wyjątku, zamiast codziennych raportów, których nikt nie czyta.
Budowa tabeli — wykaz kolumn
Trzydzieści pięć kolumn układa się w cztery czytelne grupy. Poniższy wykaz zachowuje ten podział.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Identyfikacja zadania | |||
ID_JOBS | int liczba całkowita | tak | Unikalny identyfikator wiersza tabeli |
NAZWA | varchar(100) tekst do 100 znaków | tak | Nazwa zadania |
TYPZADANIA | varchar(50) tekst do 50 znaków | tak | Typ zadania do wykonania |
PRX | varchar(3) tekst do 3 znaków | tak | Oznaczenie kodem PRX wiersza tabeli |
ACH | varchar(1) tekst do 1 znaków | tak | Oznaczenie stanu wiersza tabeli |
AKTYWNE | bit wartość logiczna 0/1 | tak | Oznaczenie czy dany wiersz tabeli jest aktywny czy nie |
SYSTEMOWE | bit wartość logiczna 0/1 | tak | Oznaczenie czy zapis w bazie ROOT jest systemowy i czy będzie instalowany podczas synchornizacji struktury bazy danych |
KIEDY | datetime data i godzina | tak | Data i czas zapisu wiersza w tabeli - dodania zadania |
LASTUPDATE | timestamp znacznik wersji wiersza | nie | Czas ostatniej aktualizacji zadania |
| Harmonogram | |||
CYKLICZNOSC | int liczba całkowita | tak | Oznaczenie cyklu do wykonania |
CYKLICZNOSCTYPE | varchar(10) tekst do 10 znaków | tak | Typ cykliczności do wykonania zadania |
GODZINA | time godzina | nie | Godzina o której ma być realizowane zadanie |
DNIZADANIA | int liczba całkowita | tak | Dni tygodnia w których zadanie ma być wykonywane, np. Jeśli chcemy zadanie codziennie od pon do piątku wpisujemy: 1,2,3,4,5 |
ZADANIESOBOTA | bit wartość logiczna 0/1 | tak | Oznaczenie czy zadanie ma być wykonywane w sobotę |
ZADANIENIEDZIELA | bit wartość logiczna 0/1 | tak | Oznaczenie czy zadanie ma być wykonywane w niedzielę |
TERMIN | date data | nie | Dzień do którego zadanie ma być wykonywane - termin realizacji |
OSTATNIOWYKONANO | datetime data i godzina | nie | Data i czas ostatniego wykonania zadania |
| Warunek wykonania | |||
JEZELI_ZAPYTANIE | varchar(max) tekst bez limitu długości | nie | Zapytanie SELECT zwaracające wyniki dla pól JEZELI_TAK, JEZELI_NIE, JEZELI_TAK_MAIL, JEZELI_NIE_MAIL |
JEZELI_TAK | bit wartość logiczna 0/1 | nie | Określenie, czy polecenie ma zostać wykonywane w zależności od wyników zapytania w polu JEZELI_ZAPYTANIE |
JEZELI_NIE | bit wartość logiczna 0/1 | nie | Określenie, czy polecenie ma zostać wykonywane w zależności od wyników zapytania w polu JEZELI_ZAPYTANIE |
JEZELI_TAK_MAIL | varchar(max) tekst bez limitu długości | nie | Treść wiadomości e-mail, w zależności od wyników zapytania w polu Zapytanie jeżeli |
JEZELI_NIE_MAIL | varchar(max) tekst bez limitu długości | nie | Treść wiadomości e-mail, w zależności od wyników zapytania w polu Zapytanie jeżeli |
| Wynik i powiadomienia | |||
MAILPOWIADOMIENIE | varchar(max) tekst bez limitu długości | nie | Adres mailowy do wysłania powiadomienia o wykonaniu zadania lub wysłania raportu |
MAILPOWIADOMIENIEDW | varchar(max) tekst bez limitu długości | nie | Adres mailowy do wysłania powiadomienia o wykonaniu zadania lub wysłania raportu |
MAILPOWIADOMIENIEUDW | varchar(max) tekst bez limitu długości | nie | Adres mailowy do wysłania powiadomienia o wykonaniu zadania lub wysłania raportu |
FORMAT | varchar(10) tekst do 10 znaków | nie | Format pliku raportu z wykonanego zadania - raportu |
SCIEZKARAPORTU | varchar(250) tekst do 250 znaków | nie | Folder do umieszczania raportów wykonywanych przez zadania automatyczne |
FOLDERKOPII | varchar(200) tekst do 200 znaków | nie | Oznaczenie folderu gdzie mają być wykonywane kopie |
RODZAJKOPII | varchar(20) tekst do 20 znaków | nie | Rodzaj kopii |
ID_RAP | int liczba całkowita | tak | Unikalny identyfikator raportu |
PARAMETRY | varchar(max) tekst bez limitu długości | nie | Miejsce na wprowadzenie parametrów do wykonywanego zadania |
CONNECTIONSTRINGNAME | varchar(200) tekst do 200 znaków | nie | Nazwa połączenia dobazy danych |
UZYTKOWNIK | varchar(150) tekst do 150 znaków | nie | Nazwa użytkownika zadania |
LOGOWANIE | bit wartość logiczna 0/1 | tak | Oznaczenie czy wymagane jest lgowanie, czy też zadanie wykonywane jest automatycznie |
NRIDODN | varchar(20) tekst do 20 znaków | nie | Identyfikator kontrahenta |
Kolumna DNIZADANIA koduje dni tygodnia liczbowo, a soboty i niedziele mają dodatkowo własne znaczniki. Przy zmianie harmonogramu trzeba sprawdzić wszystkie trzy ustawienia — pominięcie jednego jest częstą przyczyną zadań wykonujących się w nieoczekiwane dni.
Indeksy i wydajność zapytań
Tabela zawiera zwykle od kilku do kilkudziesięciu wierszy i jest odczytywana w całości przy każdym przebiegu harmonogramu, dlatego indeksowanie ogranicza się do klucza głównego.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
PK__jobs | ID_JOBS | klucz główny |
Klucz główny na kolumnie ID_JOBS w zupełności wystarcza. Odczyt całej tabeli przy takiej liczbie wierszy jest tańszy niż utrzymywanie dodatkowych indeksów, a zadania są modyfikowane rzadko.
Dlaczego zadania automatyczne przestają działać niezauważenie
Awaria zadania automatycznego różni się od awarii ekranu jedną cechą: nikt jej nie zgłasza. Użytkownik zauważy zablokowany formularz natychmiast, a brak porannego raportu — czasem po tygodniu. Poniżej najczęstsze przyczyny cichych przestojów.
| Przyczyna | Jak ją rozpoznać | Zapobieganie |
|---|---|---|
| Upłynął termin z kolumny TERMIN | Data w kolumnie jest wcześniejsza niż dzisiejsza | Kontrola zadań zbliżających się do terminu |
| Zmiana hasła konta z kolumny UZYTKOWNIK | Zadanie przestaje działać w dniu zmiany hasła | Konto techniczne z hasłem niepodlegającym wygaśnięciu |
| Warunek SELECT nigdy nie zwraca wyniku | OSTATNIOWYKONANO nie zmienia się mimo aktywnego zadania | Sprawdzenie zapytania warunkowego po zmianach w danych |
| Katalog zapisu przestał być dostępny | Zadanie kończy się błędem, raport nie powstaje | Monitorowanie rejestru błędów pod kątem zadań |
| Zadanie wyłączone znacznikiem AKTYWNE | Kolumna ma wartość 0, często po pracach serwisowych | Przegląd listy zadań po każdych pracach na bazie |
Wspólny mianownik: kolumna OSTATNIOWYKONANO ujawnia wszystkie te sytuacje, o ile ktoś do niej zagląda.
Najprostsze zabezpieczenie to zadanie kontrolujące pozostałe zadania — codzienne zapytanie sprawdzające, które definicje mają datę ostatniego wykonania starszą niż wynikałoby z ich cyklu. Wysłane na jeden adres, zajmuje minutę pracy i wychwytuje wszystkie przypadki z powyższej tabeli.
Jak korzystać z tabeli w praktyce
Przy definiowaniu i utrzymaniu zadań automatycznych warto trzymać się kilku zasad:
- Nadawaj w kolumnie
NAZWAopis zrozumiały dla osoby, która zobaczy zadanie po raz pierwszy — nazwy techniczne utrudniają późniejszą diagnozę. - Ustawiaj powiadomienia warunkowe zamiast codziennych; raport przychodzący bez wyjątku przestaje być czytany po kilku tygodniach.
- Rozkładaj godziny uruchomienia — kilka zadań startujących o tej samej minucie potrafi obciążyć serwer bardziej niż praca użytkowników.
- Sprawdzaj kolumnę
OSTATNIOWYKONANOcyklicznie; to jedyny sygnał, że zadanie przestało działać. - Testuj zapytanie z kolumny
JEZELI_ZAPYTANIEosobno przed zapisaniem definicji — błąd w nim wstrzymuje całe zadanie. - Używaj konta technicznego w kolumnie
UZYTKOWNIK, z hasłem niepodlegającym wygaśnięciu; zadania oparte na koncie pracownika przestają działać przy zmianie hasła.
Kontrola zadań, które mimo aktywnego statusu nie wykonały się w ciągu ostatniej doby:
SELECT NAZWA,
TYPZADANIA,
CYKLICZNOSCTYPE,
GODZINA,
OSTATNIOWYKONANO,
TERMIN,
DATEDIFF(HOUR, OSTATNIOWYKONANO, GETDATE()) AS GODZIN_TEMU
FROM dbo._jobs
WHERE AKTYWNE = 1
AND (OSTATNIOWYKONANO IS NULL
OR OSTATNIOWYKONANO < DATEADD(DAY, -1, GETDATE()))
ORDER BY OSTATNIOWYKONANO;
Wiersze z pustą kolumną OSTATNIOWYKONANO wymagają osobnej uwagi — oznaczają zadania, które nie wykonały się ani razu od chwili zdefiniowania.
Automatyzacja odciąża zespół tylko wtedy, gdy ktoś pilnuje, że nadal działa. Jedno zadanie kontrolujące pozostałe kosztuje kilkanaście minut konfiguracji i zamyka lukę, przez którą najczęściej wypadają raporty i kopie zapasowe.
Powiązane tabele i dokumentacja
Zadania automatyczne korzystają z definicji zapytań i raportów opisanych w pozostałych tabelach systemowych: