- Dziennik odpowiada na cztery pytania jednocześnie: kto, kiedy, skąd i czego dotyczyła operacja zmieniająca dane.
- Kontekst organizacyjny — magazyn, oddział, MPK, rola i firma — jest zapisywany razem ze zdarzeniem, więc raport nie wymaga późniejszego łączenia z kartotekami.
- Siedem indeksów obsługuje typowe pytania audytowe: o użytkownika, o kontrahenta, o dokument i o przedział czasu.
- Wpis jest nieusuwalny w normalnym trybie pracy — na tym opiera się wiarygodność całego mechanizmu.
Do czego służy tabela [dbo].[_dziennik]
Pytanie „kto to zmienił” pada w każdej firmie i zwykle pada za późno — kilka dni po zdarzeniu, gdy nikt już nie pamięta szczegółów. Tabela [dbo].[_dziennik] istnieje po to, żeby odpowiedź nie zależała od pamięci. Zapisuje każdą operację modyfikującą dane wraz z pełnym kontekstem, w jakim została wykonana.
Zakres zapisywanych informacji wykracza poza samo „kto i kiedy”. Wiersz zawiera adres IP i identyfikator hosta, z którego nastąpiło połączenie, nazwę roli oraz roli systemowej, symbol magazynu, oddziału i miejsca powstawania kosztów, a także numer dokumentu i identyfikator kontrahenta, których operacja dotyczyła. Kolumna TRANSAKCJA wskazuje, która operacja systemowa doprowadziła do zapisu, a UWAGI mieści opis zdarzenia.
Takie ujęcie ma konkretny cel: pozwala odtworzyć okoliczności zdarzenia bez sięgania do innych tabel. Kartoteka użytkownika może się zmienić, magazyn zostać przemianowany, a rola przypisana komu innemu — dziennik zachowuje stan z chwili operacji. To różnica między zapisem historycznym a raportem generowanym z bieżących danych.
Komplet kontekstu w jednym wierszu sprawia, że raport audytowy nie wymaga złączeń z kartotekami, które w międzyczasie mogły się zmienić.
Budowa tabeli — wykaz kolumn
Strukturę wygodnie czytać w podziale na cztery grupy: metrykę wpisu, dane osoby wykonującej operację, kontekst organizacyjny oraz identyfikację przedmiotu zdarzenia.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Metryka wpisu | |||
ID__DZIENNIK | int liczba całkowita | tak | Unikalny identyfikator wiersza tabeli |
KIEDY | datetime data i godzina | tak | Systemowo zapisywana data i czas dodania rekordu do bazy |
DDOWOD | date data | tak | Data dopisania rekordu do bazy |
DZIEN | date data | nie | Data zapisu |
STAMP | timestamp znacznik wersji wiersza | tak | Wewnętrzny identyfikator aktualizacji wiersza |
ACH | varchar(1) tekst do 1 znaków | tak | Jednoznakowe oznaczenie stan danego wiersza tabeli, 0 - bufor, 1 - zatwierdzony |
AKTYWNE | bit wartość logiczna 0/1 | tak | Oznacznie czy dany wiersz tabeli jest aktywny czy nieaktywny |
PRX | varchar(5) tekst do 5 znaków | nie | Identyfikator grupy rekordów |
| Kto wykonał operację | |||
LOGIN | varchar(50) tekst do 50 znaków | nie | Login użytkownika dokonującego zapisu w bazie |
ROLA | varchar(20) tekst do 20 znaków | nie | Nazwa roli która dokonała zapisu w dzienniku |
ROLSSYS | varchar(3) tekst do 3 znaków | nie | Symbol roli systemowej (głównej) która dokonała zapisu w dzienniku |
IP | varchar(max) tekst bez limitu długości | nie | Identyfikator IP kompuetra z którego dokonywano zapisu |
HOST | varchar(max) tekst bez limitu długości | nie | Identyfikator hosta z którego następowało połącznie z programem |
| Kontekst organizacyjny | |||
FIRMA | varchar(20) tekst do 20 znaków | tak | Kod firmy |
ODDZIAL | varchar(5) tekst do 5 znaków | nie | Symbol oddziału użytkownika który dokonywał wpisu w dzienniku |
MAGAZYN | varchar(5) tekst do 5 znaków | nie | Symbol magazynu |
MPK | varchar(20) tekst do 20 znaków | nie | Symbol MPK użytkownika który dokonywał wpisu w dzienniku |
NRIDODN | bigint liczba całkowita 64-bitowa | nie | Identyfikator obsługiwanej firmy w przypadku pracy per klient |
| Czego dotyczyło zdarzenie | |||
TYTUL | varchar(50) tekst do 50 znaków | nie | Tytuł zapisu |
UWAGI | varchar(max) tekst bez limitu długości | nie | Opis zdarzenia zapisywanego w dzienniku |
TRANSAKCJA | varchar(50) tekst do 50 znaków | nie | Nazwa transakcji która realizuje dopisanie zdarzenia do dziennika |
NUMERDOK | varchar(20) tekst do 20 znaków | nie | Numer dokumentu |
TYPDOK | varchar(10) tekst do 10 znaków | nie | Typ dokumentu |
REFNO | varchar(20) tekst do 20 znaków | nie | Numer referencyjny |
KTRHID | varchar(20) tekst do 20 znaków | nie | Identyfikator kontrahenta |
Kolumna KIEDY jest wypełniana przez serwer bazy, nie przez aplikację. Ma to znaczenie dla wiarygodności zapisu — czas nie zależy wtedy od ustawień zegara na stanowisku użytkownika.
Indeksy i wydajność zapytań
Zestaw indeksów odzwierciedla pytania, które faktycznie zadaje się dziennikowi. Każde z nich dotyczy innego punktu wyjścia: osoby, kontrahenta, dokumentu albo przedziału czasu.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
ID__DZIENNIK | ID__DZIENNIK | zwykły |
KIEDY | KIEDY | zwykły |
KTRHID_KIEDY | KTRHID, KIEDY | zwykły |
LOGIN_KIEDY | LOGIN, KIEDY | zwykły |
PK__dziennik | ID__DZIENNIK | klucz główny |
REFNO | REFNO | zwykły |
TYTUL | PRX, KIEDY, LOGIN, REFNO, KTRHID, NUMERDOK, TYPDOK, MAGAZYN, UWAGI, MPK, DDOWOD, TYTUL | zwykły |
Warto zwrócić uwagę na indeksy złożone LOGIN_KIEDY i KTRHID_KIEDY. Kolejność kolumn nie jest przypadkowa: najpierw wartość filtrowana równością, potem zakres dat. Odwrotna kolejność zmusiłaby serwer do przejrzenia wszystkich wpisów z danego okresu zamiast wejścia wprost w zakres należący do jednego użytkownika.
Do czego dziennik przydaje się w praktyce
Dziennik bywa zakładany „bo trzeba”, a potem nikt do niego nie zagląda. Poniższe zestawienie pokazuje sytuacje, w których faktycznie rozstrzyga sprawę, oraz to, po której kolumnie warto wtedy szukać.
| Sytuacja | Punkt wyjścia | Czego szukać |
|---|---|---|
| Dokument ma inną wartość niż wczoraj | REFNO lub NUMERDOK | Wszystkie wpisy dotyczące dokumentu w kolejności czasu |
| Kontrola zgodności z procedurą | ROLA i TRANSAKCJA | Operacje wykonane przez rolę, która nie powinna mieć do nich prawa |
| Podejrzenie dostępu z niewłaściwego stanowiska | IP lub HOST | Zdarzenia z adresów spoza sieci firmowej albo poza godzinami pracy |
| Reklamacja kontrahenta | KTRHID z zakresem dat | Pełna historia operacji dotyczących danego odbiorcy |
| Rozliczenie pracy działu | MPK lub ODDZIAL | Liczba i rodzaj operacji w podziale na jednostki |
Każdemu z tych punktów wyjścia odpowiada indeks założony na tabeli — stąd ich liczba mimo prostoty samej struktury.
Wiarygodność dziennika opiera się na jednym założeniu: że wpisów się nie usuwa ani nie modyfikuje. Uprawnienia do tabeli powinny to odzwierciedlać — konta aplikacyjne potrzebują wyłącznie prawa zapisu i odczytu, nigdy prawa aktualizacji czy usuwania. Bez tego ograniczenia dziennik pozostaje wygodnym narzędziem diagnostycznym, ale przestaje być dowodem.
Jak korzystać z tabeli w praktyce
Praca z dziennikiem sprowadza się zwykle do zawężenia zakresu i przeczytania wpisów w kolejności chronologicznej. Kilka uwag praktycznych:
- Zaczynaj od najwęższego dostępnego kryterium — numeru dokumentu albo loginu — i dopiero potem rozszerzaj zakres dat.
- Nie filtruj po kolumnie
UWAGI; to pole tekstowe bez indeksu, a wyszukiwanie w nim wymusza przejrzenie całej tabeli. - Przy analizie porównawczej korzystaj z kolumny
DDOWODzamiastKIEDY, jeśli interesuje cię dzień, a nie dokładny moment operacji. - Zaplanuj archiwizację starszych wpisów — dziennik rośnie proporcjonalnie do liczby operacji i po kilku latach potrafi być największą tabelą w bazie.
- Ogranicz uprawnienia: konto aplikacji powinno mieć prawo dopisywania i odczytu, ale nie aktualizacji ani usuwania wierszy.
- Pamiętaj, że dziennik rejestruje operacje wykonane przez aplikację — zmiany wprowadzone bezpośrednio w bazie narzędziem administracyjnym się w nim nie pojawią.
Pełna historia operacji dotyczących wskazanego dokumentu, w kolejności chronologicznej:
SELECT KIEDY,
LOGIN,
ROLA,
MAGAZYN,
TRANSAKCJA,
TYTUL,
IP,
LEFT(UWAGI, 200) AS OPIS
FROM dbo._dziennik
WHERE REFNO = @refno
AND KIEDY >= DATEADD(MONTH, -3, GETDATE())
ORDER BY KIEDY;
Warunek na kolumnie REFNO korzysta z założonego na niej indeksu, a ograniczenie zakresu dat dodatkowo zawęża liczbę odczytanych stron danych.
Dziennik zdarzeń jest jednym z tych elementów systemu, których wartość ujawnia się dopiero w sytuacji spornej. Utrzymywanie go w porządku — z sensowną archiwizacją i ograniczonymi uprawnieniami — kosztuje niewiele, a bywa jedynym sposobem ustalenia, co się faktycznie wydarzyło.
Powiązane tabele i dokumentacja
Dziennik zdarzeń uzupełniają rejestry o węższym zakresie, opisujące sesje, błędy i historię poszczególnych rekordów: