SQL Server w logistyce

Tabela _dziennik w bazie danych SQL Server

Ślad rewizyjny bazy StudioSystem — zapisuje, kto, kiedy, skąd i na czym wykonał operację zmieniającą dane.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • 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.

Cztery wymiary zapisu w dzienniku zdarzeń
Kto KtoLogin, rola i rola systemowa osoby wykonującej operację
Skąd SkądAdres IP i identyfikator hosta, z którego nastąpiło połączenie
W jakim kontekście W jakim kontekścieFirma, oddział, magazyn i miejsce powstawania kosztów
Czego dotyczyło Czego dotyczyłoNumer dokumentu, kontrahent, typ operacji i opis zdarzenia

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.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Metryka wpisu
ID__DZIENNIKint
liczba całkowita
takUnikalny identyfikator wiersza tabeli
KIEDYdatetime
data i godzina
takSystemowo zapisywana data i czas dodania rekordu do bazy
DDOWODdate
data
takData dopisania rekordu do bazy
DZIENdate
data
nieData zapisu
STAMPtimestamp
znacznik wersji wiersza
takWewnętrzny identyfikator aktualizacji wiersza
ACHvarchar(1)
tekst do 1 znaków
takJednoznakowe oznaczenie stan danego wiersza tabeli, 0 - bufor, 1 - zatwierdzony
AKTYWNEbit
wartość logiczna 0/1
takOznacznie czy dany wiersz tabeli jest aktywny czy nieaktywny
PRXvarchar(5)
tekst do 5 znaków
nieIdentyfikator grupy rekordów
Kto wykonał operację
LOGINvarchar(50)
tekst do 50 znaków
nieLogin użytkownika dokonującego zapisu w bazie
ROLAvarchar(20)
tekst do 20 znaków
nieNazwa roli która dokonała zapisu w dzienniku
ROLSSYSvarchar(3)
tekst do 3 znaków
nieSymbol roli systemowej (głównej) która dokonała zapisu w dzienniku
IPvarchar(max)
tekst bez limitu długości
nieIdentyfikator IP kompuetra z którego dokonywano zapisu
HOSTvarchar(max)
tekst bez limitu długości
nieIdentyfikator hosta z którego następowało połącznie z programem
Kontekst organizacyjny
FIRMAvarchar(20)
tekst do 20 znaków
takKod firmy
ODDZIALvarchar(5)
tekst do 5 znaków
nieSymbol oddziału użytkownika który dokonywał wpisu w dzienniku
MAGAZYNvarchar(5)
tekst do 5 znaków
nieSymbol magazynu
MPKvarchar(20)
tekst do 20 znaków
nieSymbol MPK użytkownika który dokonywał wpisu w dzienniku
NRIDODNbigint
liczba całkowita 64-bitowa
nieIdentyfikator obsługiwanej firmy w przypadku pracy per klient
Czego dotyczyło zdarzenie
TYTULvarchar(50)
tekst do 50 znaków
nieTytuł zapisu
UWAGIvarchar(max)
tekst bez limitu długości
nieOpis zdarzenia zapisywanego w dzienniku
TRANSAKCJAvarchar(50)
tekst do 50 znaków
nieNazwa transakcji która realizuje dopisanie zdarzenia do dziennika
NUMERDOKvarchar(20)
tekst do 20 znaków
nieNumer dokumentu
TYPDOKvarchar(10)
tekst do 10 znaków
nieTyp dokumentu
REFNOvarchar(20)
tekst do 20 znaków
nieNumer referencyjny
KTRHIDvarchar(20)
tekst do 20 znaków
nieIdentyfikator 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.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
ID__DZIENNIKID__DZIENNIKzwykły
KIEDYKIEDYzwykły
KTRHID_KIEDYKTRHID, KIEDYzwykły
LOGIN_KIEDYLOGIN, KIEDYzwykły
PK__dziennikID__DZIENNIKklucz główny
REFNOREFNOzwykły
TYTULPRX, KIEDY, LOGIN, REFNO, KTRHID, NUMERDOK, TYPDOK, MAGAZYN, UWAGI, MPK, DDOWOD, TYTULzwykł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ć.

Typowe zastosowania dziennika zdarzeń
SytuacjaPunkt wyjściaCzego szukać
Dokument ma inną wartość niż wczorajREFNO lub NUMERDOKWszystkie wpisy dotyczące dokumentu w kolejności czasu
Kontrola zgodności z procedurąROLA i TRANSAKCJAOperacje wykonane przez rolę, która nie powinna mieć do nich prawa
Podejrzenie dostępu z niewłaściwego stanowiskaIP lub HOSTZdarzenia z adresów spoza sieci firmowej albo poza godzinami pracy
Reklamacja kontrahentaKTRHID z zakresem datPełna historia operacji dotyczących danego odbiorcy
Rozliczenie pracy działuMPK lub ODDZIALLiczba 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 DDOWOD zamiast KIEDY, 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:

FAQ

Najczęściej zadawane pytania o tabelę _dziennik

01

Czym dziennik zdarzeń różni się od tabeli _historia?

Dziennik rejestruje fakt wykonania operacji wraz z jej kontekstem — kto, skąd, w jakim magazynie i czego dotyczyła. Tabela _historia przechowuje natomiast zawartość rekordu przed zmianą, czyli pozwala odtworzyć wartości sprzed edycji. W praktyce korzysta się z obu: dziennik wskazuje moment i sprawcę, historia — co dokładnie zostało zmienione.

02

Czy wpisy w dzienniku można usuwać?

Technicznie tak, ale to przekreśla sens mechanizmu. Wiarygodność śladu rewizyjnego opiera się na jego nienaruszalności, dlatego konto aplikacyjne powinno mieć prawo dopisywania i odczytu, lecz nie aktualizacji ani usuwania. Ograniczanie objętości należy realizować przez archiwizację starszych wpisów, nie przez ich kasowanie.

03

Dlaczego kontekst organizacyjny jest zapisywany w każdym wierszu?

Ponieważ kartoteki się zmieniają. Użytkownik może przejść do innego oddziału, magazyn zostać przemianowany, a rola przypisana komu innemu. Zapisanie stanu z chwili operacji sprawia, że raport sprzed roku pokazuje sytuację taką, jaka wtedy była, a nie taką, jaka jest dziś.

04

Czy dziennik zarejestruje zmianę wprowadzoną bezpośrednio w bazie?

Nie. Wpisy powstają w warstwie aplikacji, więc modyfikacja wykonana narzędziem administracyjnym poza systemem nie zostawi śladu w tej tabeli. To argument za ograniczeniem dostępu do bazy produkcyjnej — bez niego luka w śladzie rewizyjnym pozostaje otwarta.

Słownik pojęć

Słownik pojęć

Pojęcia z zakresu śledzenia operacji i zgodności z wymogami kontrolnymi.

ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
RRODO
Rozporządzenie o ochronie danych osobowych. Wymaga ograniczenia dostępu do danych, rejestrowania operacji na nich i wskazania podstawy przetwarzania.
GGRC
Governance, Risk and Compliance — ład korporacyjny, zarządzanie ryzykiem i zgodność z przepisami. Wymaga dokumentowania procedur i śladu rewizyjnego.
MMPK
Miejsce powstawania kosztów — jednostka organizacyjna, do której przypisuje się wydatki. Pozwala rozliczyć koszty w podziale na działy.
WWydajność zapytań
Czas, w jakim baza danych zwraca wynik. Zależy od indeksów, planu wykonania i objętości przetwarzanych danych.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.