SQL Server w logistyce

Tabela _revision w bazie danych SQL Server

Historia zmian na poziomie pojedynczego pola — zapisuje wartość sprzed edycji i po niej, wraz z autorem i powodem.

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
  • Wiersz opisuje zmianę jednego pola — z wartością sprzed edycji i po niej.
  • Numer NRIDREV spina pola zmienione w ramach jednej operacji, więc da się odtworzyć całą edycję.
  • Kolumny TABELA, REVCOLUMN i REFNO wskazują, czego dokładnie dotyczyła zmiana.
  • Kolumna OPIS mieści powód edycji — jedyne pole w całym systemie odpowiadające na pytanie „dlaczego”.

Do czego służy tabela [dbo].[_revision]

Dziennik zdarzeń mówi, że dokument został zmieniony. Tabela [dbo].[_revision] mówi, co dokładnie się w nim zmieniło: która kolumna, jaka była wartość wcześniej i jaka jest teraz. To poziom szczegółowości potrzebny wtedy, gdy sam fakt edycji nie wystarcza — przy reklamacji, kontroli albo sporze o zawartość dokumentu.

Zapis jest prowadzony w rozbiciu na pojedyncze pola. Edycja dokumentu, w której zmieniono trzy wartości, tworzy trzy wiersze — połączone wspólnym numerem rewizji w kolumnie NRIDREV. Dzięki temu da się zarówno prześledzić losy jednego pola w czasie, jak i odtworzyć całą operację jako spójną całość.

Osobno warto zwrócić uwagę na dwie kolumny opisowe. CAPTION przechowuje etykietę pola widoczną na formularzu, więc raport nie musi tłumaczyć nazw technicznych na zrozumiałe. OPIS mieści powód edycji podawany przez użytkownika — pole, którego zwykle brakuje w systemach rejestrujących zmiany, a które najbardziej przydaje się przy analizie po czasie.

Co zapisuje jedna rewizja pola
Przedmiot PrzedmiotTabela, kolumna i numer referencyjny zmienianego rekordu
Wartości WartościZawartość pola przed edycją i po niej, w osobnych kolumnach
Autor AutorLogin użytkownika oraz dokładny czas operacji
Powód PowódUzasadnienie zmiany podane przez użytkownika przy zapisie

Numer rewizji spina wszystkie pola zmienione w jednej operacji — bez niego widać osobne zmiany, ale nie widać edycji jako całości.

Budowa tabeli — wykaz kolumn

Dwanaście kolumn dzieli się na wskazanie przedmiotu zmiany, jej treść oraz okoliczności.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Przedmiot zmiany
BAZAvarchar(50)
tekst do 50 znaków
takNazwa bazy danych, tabeli ktroa jest poddawana rewizji, domyślnie softwarestudioConnectionString lub customConnectionString
TABELAvarchar(50)
tekst do 50 znaków
takNazwa tabeli poddanej rewizji
REVCOLUMNvarchar(50)
tekst do 50 znaków
takNazwa kolumny, w której została zmienina wartość - kolumna poddana rewizji
REFNObigint
liczba całkowita 64-bitowa
takIdentyfikator rekordu tabeli poddawanej rewizji np. NRID.., REFNO, REFNO_POZ
CAPTIONvarchar(100)
tekst do 100 znaków
nieEtykieta pola wyświetlana na formularzy, opis kontrolki
Treść zmiany
OVALUEvarchar(max)
tekst bez limitu długości
takDotychczasowa wartość pola (old value)
NVALUEvarchar(max)
tekst bez limitu długości
takNowa wartość pola (new value)
Okoliczności
ID_REVISIONint
liczba całkowita
takIdentyfikator wiersza tabeli
NRIDREVbigint
liczba całkowita 64-bitowa
takUnikalny numer rewizji, łączy poszczególne zapisy danej rewizji
KIEDYdatetime
data i godzina
takdata i czas wykonania rewizji
LOGINvarchar(50)
tekst do 50 znaków
takLogin użytkownika, który wykonał zmian w zapisie
OPISvarchar(max)
tekst bez limitu długości
nieOpis przyczyny dla której edytowano rekord, opconalnie zapisywane, gdy w x_skorowidz dla danej rewizji ustawiono parametr na DOMYSLNE=True

Kolumny OVALUE i NVALUE mają typ varchar(max) i są oznaczone jako wymagane. Wartość pusta jest więc zapisywana jako pusty ciąg, nie jako brak wartości — o czym trzeba pamiętać przy porównywaniu.

Indeksy i wydajność zapytań

Trzy indeksy odpowiadają dwóm sposobom czytania historii: śledzeniu jednego rekordu oraz odtwarzaniu pojedynczej operacji.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
PK__revisionID_REVISIONklucz główny
REFNOREFNOzwykły
REFNO_NRIDREVREFNO, NRIDREVzwykły

Indeks złożony REFNO_NRIDREV obsługuje najczęstszy scenariusz — pobranie historii rekordu z pogrupowaniem po operacjach. Osobny indeks na samym REFNO przydaje się, gdy interesują nas wszystkie zmiany bez rozbicia na rewizje.

Trzy poziomy szczegółowości zapisu zmian

StudioSystem prowadzi zapis zmian na trzech poziomach, które odpowiadają na coraz bardziej szczegółowe pytania. Dobór właściwego zależy od tego, czego się szuka.

Rejestry zmian i ich zakres
PoziomTabelaOdpowiada na pytanie
Operacja w systemie_dziennikKto, kiedy i skąd wykonał jakąś operację
Zdarzenie na dokumencie_historiaCo działo się z tym konkretnym dokumentem
Zmiana pojedynczego pola_revisionJaka wartość była wcześniej, a jaka jest teraz

Wszystkie trzy wiąże numer referencyjny REFNO, więc przejście między poziomami nie wymaga dopasowywania po czasie i loginie.

Rozdzielenie ma też uzasadnienie praktyczne. Zapis na poziomie pola jest najbardziej kosztowny — jedna edycja formularza z dziesięcioma polami tworzy dziesięć wierszy. Gdyby prowadzić go dla wszystkich tabel w systemie, rejestr rewizji przewyższyłby objętością dane operacyjne. Stąd kolumna TABELA: mechanizm włącza się wybiórczo, dla struktur, w których szczegółowość jest naprawdę potrzebna.

Jak korzystać z tabeli w praktyce

Przy korzystaniu z rejestru rewizji sprawdzają się poniższe zasady:

  • Grupuj wyniki po NRIDREV, gdy chcesz zobaczyć edycję jako całość, a nie ciąg niepowiązanych zmian pól.
  • Pokazuj w raportach wartość z kolumny CAPTION zamiast nazwy technicznej kolumny — użytkownik rozpozna pole z formularza.
  • Wymuszaj wypełnienie kolumny OPIS przy edycji dokumentów o znaczeniu rozliczeniowym; bez powodu sama zmiana niewiele wyjaśnia.
  • Włączaj rejestrowanie wybiórczo, dla tabel faktycznie tego wymagających — koszt rośnie z liczbą zmienianych pól, nie dokumentów.
  • Pamiętaj, że wartość pusta zapisywana jest jako pusty ciąg; porównanie z wartością nieustaloną wymaga uwzględnienia obu przypadków.
  • Archiwizuj starsze rewizje osobno od danych operacyjnych — ten rejestr rośnie najszybciej ze wszystkich.

Pełna historia zmian wskazanego rekordu, pogrupowana po operacjach:

SELECT  r.NRIDREV,
        r.KIEDY,
        r.LOGIN,
        ISNULL(r.CAPTION, r.REVCOLUMN) AS POLE,
        LEFT(r.OVALUE, 100)            AS BYLO,
        LEFT(r.NVALUE, 100)            AS JEST,
        LEFT(r.OPIS, 150)              AS POWOD
FROM    dbo._revision AS r
WHERE   r.REFNO  = @refno
  AND   r.TABELA = @tabela
ORDER BY r.NRIDREV, r.REVCOLUMN;

Sortowanie po numerze rewizji, a nie po czasie, sprawia, że pola zmienione w jednej operacji pozostają razem — nawet jeśli zapis trwał kilka sekund.

Rejestr zmian na poziomie pola jest najdroższym rodzajem zapisu i najbardziej wartościowym, gdy trzeba wykazać, jak wyglądał dokument w konkretnym momencie. Właściwa decyzja przy wdrożeniu nie brzmi „włączyć czy nie”, tylko „dla których tabel”.

Powiązane tabele i dokumentacja

Rejestr rewizji stanowi najniższy poziom zapisu zmian; pozostałe opisują poniższe tabele:

FAQ

Najczęściej zadawane pytania o tabelę _revision

01

Czym rejestr rewizji różni się od historii dokumentu?

Poziomem szczegółowości. Tabela _historia odnotowuje zdarzenia dotyczące dokumentu — że został zatwierdzony, skorygowany, wycofany. Tabela _revision schodzi poziom niżej i zapisuje, która kolumna zmieniła wartość, jaka była wcześniej i jaka jest teraz. Pierwsza odpowiada na pytanie „co się stało”, druga na „co konkretnie się zmieniło”.

02

Do czego służy numer NRIDREV?

Spina wszystkie pola zmienione w ramach jednej operacji. Edycja formularza, w której poprawiono trzy wartości, tworzy trzy wiersze o wspólnym numerze rewizji. Bez niego widać byłoby ciąg niepowiązanych zmian, a nie edycję jako spójną całość.

03

Czy rejestr można włączyć dla wszystkich tabel?

Technicznie tak, ale koszt rośnie z liczbą zmienianych pól, nie dokumentów — jedna edycja formularza o dziesięciu polach tworzy dziesięć wierszy. Przy pełnym pokryciu rejestr szybko przewyższa objętością dane operacyjne. Dlatego mechanizm włącza się wybiórczo, dla struktur, w których szczegółowość jest naprawdę potrzebna.

04

Po co osobna kolumna OPIS?

Mieści powód edycji podawany przez użytkownika. To jedyne miejsce w systemie odpowiadające na pytanie „dlaczego”, a nie tylko „co i kiedy”. Przy dokumentach o znaczeniu rozliczeniowym warto wymusić jej wypełnienie — po pół roku sama informacja o zmianie kwoty bez podania przyczyny niewiele wyjaśnia.

Słownik pojęć

Słownik pojęć

Pojęcia związane ze szczegółowym zapisem zmian w danych.

ŚŚ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.
IIdentyfikowalność
Zdolność odtworzenia drogi towaru — od dostawcy, przez magazyn, po odbiorcę. Wymagana prawem w branży spożywczej i farmaceutycznej.
GGRC
Governance, Risk and Compliance — ład korporacyjny, zarządzanie ryzykiem i zgodność z przepisami. Wymaga dokumentowania procedur i śladu rewizyjnego.
RRODO
Rozporządzenie o ochronie danych osobowych. Wymaga ograniczenia dostępu do danych, rejestrowania operacji na nich i wskazania podstawy przetwarzania.
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.

Zobacz to w praktyce

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