SQL Server w logistyce

Tabela _api_sql w bazie danych SQL Server

Rejestr wywołań API po stronie bazy danych — zapisuje żądania przychodzące i wychodzące wraz z odpowiedzią usługi.

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
  • Tabela gromadzi komplet informacji o pojedynczym wywołaniu API: adres, metodę HTTP, nagłówki, treść żądania i odpowiedzi oraz status zwrócony przez usługę.
  • Kolumna KIERUNEK rozdziela dwa scenariusze — PRZYCH to dane przyjęte przez system, WYCH to wywołanie usługi zewnętrznej.
  • Sześć indeksów zbudowano pod typowe pytania diagnostyczne: co się działo w danym czasie, które wywołania zakończyły się błędem, jak przebiegła konkretna operacja.
  • Kolumny typu varchar(max) rosną szybko, dlatego tabela wymaga zaplanowanej archiwizacji starszych wpisów.

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

Integracja przez API zawodzi rzadko, ale gdy już zawiedzie, pytanie brzmi zawsze tak samo: co dokładnie zostało wysłane i co przyszło w odpowiedzi. Tabela [dbo].[_api_sql] odpowiada na nie bez zgadywania, bo przechowuje pełną treść żądania i odpowiedzi razem z nagłówkami oraz kodem statusu HTTP.

Rejestr obejmuje ruch w obie strony. Przy kierunku PRZYCH zapisywane są dane przyjęte do przetworzenia po stronie SQL Server wraz z identyfikatorem operacji, co pozwala powiązać wywołanie z jego skutkiem w bazie. Przy kierunku WYCH tabela dokumentuje wywołanie usługi zewnętrznej — kuriera, systemu ERP albo bramki powiadomień — łącznie z komunikatem błędu, jeśli usługa go zwróciła.

Dla zespołu utrzymania oznacza to jedno miejsce, w którym da się odtworzyć przebieg wymiany danych bez sięgania po logi serwera aplikacji. Dla wdrożeniowca — możliwość sprawdzenia, czy problem leży po stronie systemu, czy kontrahenta.

Co trafia do rejestru przy jednym wywołaniu API
Żądanie ŻądanieAdres, metoda HTTP, nagłówki i treść zapisane w kolumnach REQUEST_*
Przetworzenie PrzetworzenieIdentyfikator operacji SQL wiąże wywołanie z jego skutkiem w bazie
Odpowiedź OdpowiedźStatus HTTP, nagłówki i treść zwrócone przez usługę
Błąd BłądKomunikat usługi zewnętrznej zapisany w kolumnie BLAD

Komplet danych o jednym wywołaniu mieści się w jednym wierszu, dzięki czemu diagnoza nie wymaga łączenia kilku źródeł logów.

Budowa tabeli — wykaz kolumn

Struktura dzieli się na trzy grupy: metryka wpisu, opis żądania w kolumnach z przedrostkiem REQUEST_ oraz opis odpowiedzi w kolumnach RESPONSE_. Pełny wykaz wygląda następująco:

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
BLADvarchar(max)
tekst bez limitu długości
nieBłąd wywołania obcej usługi (tylko dla WYCH)
ID_API_SQLbigint
liczba całkowita 64-bitowa
takIdentyfikator wiersza tabeli
KIEDYdatetime
data i godzina
takCzas utworzenia rekordu
KIERUNEKvarchar(50)
tekst do 50 znaków
takKierunek operacji, PRZYCH - przyjęcie danych, WYCH - wywołanie obcej usługi
REQUEST_ACTION_DATAvarchar(max)
tekst bez limitu długości
nieŻądanie - dane przekazane do SQL (tylko dla PRZYCH)
REQUEST_ACTION_UIDvarchar(50)
tekst do 50 znaków
nieŻądanie - identyfikator SQL (tylko dla PRZYCH)
REQUEST_BODYvarchar(max)
tekst bez limitu długości
nieŻądanie - treść
REQUEST_METODAvarchar(10)
tekst do 10 znaków
takŻądanie - metoda HTTP
REQUEST_NAGLOWKIvarchar(max)
tekst bez limitu długości
nieŻądanie - nagłówki
REQUEST_URLvarchar(4000)
tekst do 4000 znaków
nieŻądanie - adres
RESPONSE_BODYvarchar(max)
tekst bez limitu długości
nieOdpowiedź z usługi - treść
RESPONSE_NAGLOWKIvarchar(max)
tekst bez limitu długości
nieOdpowiedź z usługi - nagłówki
RESPONSE_STATUSint
liczba całkowita
nieOdpowiedź z usługi - status
STAMPtimestamp
znacznik wersji wiersza
takZnacznik czasowy utworzenia rekordu

Kolumny REQUEST_ACTION_DATA i REQUEST_ACTION_UID wypełniane są wyłącznie dla kierunku PRZYCH, a kolumna BLAD — wyłącznie dla WYCH.

Indeksy i wydajność zapytań

Indeksy odpowiadają pytaniom, które w praktyce zadaje się rejestrowi najczęściej: o przedział czasu, o kierunek ruchu i o wywołania zakończone niepowodzeniem.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
IX__api_sql_KIEDYKIEDYzwykły
IX__api_sql_KIERUNEKKIERUNEKzwykły
IX__api_sql_REQUEST_ACTION_UIDREQUEST_ACTION_UIDzwykły
IX__api_sql_REQUEST_METODAREQUEST_METODAzwykły
IX__api_sql_RESPONSE_STATUSRESPONSE_STATUSzwykły
PK__api_sqlID_API_SQLklucz główny

Przy dużym ruchu warto rozważyć indeks złożony na parze KIEDY i RESPONSE_STATUS. Zapytanie o błędy z ostatniej doby jest wtedy obsługiwane jednym przeszukaniem zakresu zamiast filtrowania po odczycie.

Ile rejestr zajmuje miejsca i jak długo go przechowywać

Rejestr wywołań rośnie szybciej niż jakakolwiek inna tabela systemowa, bo w jednym wierszu zapisuje pełne treści żądania i odpowiedzi. Przy integracji obsługującej kilka tysięcy wywołań dziennie przyrost liczy się w gigabajtach miesięcznie. Decyzja o okresie przechowywania nie jest więc szczegółem technicznym — przekłada się wprost na czas wykonania kopii zapasowej i koszt przestrzeni dyskowej.

Warianty przechowywania rejestru wywołań
WariantCo zostajeZastosowanie
Pełny zapisWszystkie kolumny, wszystkie wywołaniaOkres stabilizacji po uruchomieniu integracji, gdy liczy się możliwość odtworzenia każdego przypadku
Skrócenie treściMetryka w całości, treści przycięte do kilku kilobajtówPraca ustabilizowana — do diagnozy zwykle wystarcza początek odpowiedzi z komunikatem błędu
Tylko niepowodzeniaKomplet danych wyłącznie dla statusów 4xx i 5xxIntegracje o dużym wolumenie, w których udane wywołania nie wnoszą informacji
Archiwizacja okresowaWpisy starsze niż ustalony próg przenoszone do osobnej tabeliWymóg zachowania śladu na potrzeby rozliczeń z kontrahentem

Warianty można łączyć — częstym rozwiązaniem jest pełny zapis niepowodzeń i skrócony zapis wywołań zakończonych powodzeniem.

Osobną kwestią jest ochrona danych. Nagłówki żądań zawierają zwykle token autoryzacyjny, a treść — dane kontrahentów. Rejestr powinien więc podlegać tym samym ograniczeniom dostępu co tabele operacyjne, a nagłówki autoryzacyjne warto maskować już na etapie zapisu.

Jak korzystać z tabeli w praktyce

Rejestr sprawdza się przede wszystkim w trzech sytuacjach — przy diagnozie awarii, przy odbiorze integracji od kontrahenta i przy kontroli obciążenia. W praktyce:

  • Zacznij od filtra na RESPONSE_STATUS >= 400 — kody 4xx wskazują na problem po stronie żądania, 5xx po stronie usługi.
  • Pustej wartości w RESPONSE_STATUS przy kierunku WYCH nie ignoruj: zwykle oznacza, że usługa w ogóle nie odpowiedziała, a szczegół znajdziesz w kolumnie BLAD.
  • Powiąż wpis z operacją w bazie przez REQUEST_ACTION_UID, jeśli chcesz sprawdzić, jaki dokument powstał w wyniku wywołania.
  • Zaplanuj cykliczne przenoszenie wpisów starszych niż kilka miesięcy do tabeli archiwalnej — kolumny varchar(max) zajmują najwięcej miejsca w całej bazie.
  • Nie zapisuj w rejestrze haseł ani tokenów w postaci jawnej; nagłówki autoryzacyjne warto maskować przed zapisem.
  • Do analizy obciążenia grupuj wpisy po godzinie i metodzie HTTP — rozkład zwykle ujawnia wywołania powtarzane niepotrzebnie.

Poniższe zapytanie zestawia nieudane wywołania usług zewnętrznych z ostatniej doby wraz z komunikatem błędu:

SELECT  KIEDY,
        REQUEST_METODA,
        LEFT(REQUEST_URL, 80) AS ADRES,
        RESPONSE_STATUS,
        LEFT(BLAD, 200)       AS KOMUNIKAT
FROM    dbo._api_sql
WHERE   KIERUNEK = 'WYCH'
  AND   KIEDY >= DATEADD(DAY, -1, GETDATE())
  AND   (RESPONSE_STATUS IS NULL OR RESPONSE_STATUS >= 400)
ORDER BY KIEDY DESC;

Funkcja LEFT ogranicza objętość wyniku — pełna treść odpowiedzi bywa liczona w megabajtach i niepotrzebnie obciąża narzędzie, w którym przegląda się wynik.

Rejestr wywołań ma sens tylko wtedy, gdy ktoś do niego zagląda. Warto ustawić proste zapytanie kontrolne uruchamiane raz dziennie i wysyłające podsumowanie liczby błędów — problem z integracją zwykle ujawnia się wtedy, zanim zgłosi go kontrahent.

Powiązane tabele i dokumentacja

Rejestr wywołań API współpracuje z kilkoma innymi strukturami odpowiadającymi za komunikację i śledzenie zdarzeń:

FAQ

Najczęściej zadawane pytania o tabelę _api_sql

01

Czym różni się kierunek PRZYCH od WYCH?

PRZYCH oznacza żądanie przyjęte przez system — dane przysłane z zewnątrz i przekazane do przetworzenia po stronie SQL Server. WYCH oznacza wywołanie inicjowane przez system, na przykład zgłoszenie przesyłki do kuriera. Dla PRZYCH wypełniane są kolumny z przedrostkiem REQUEST_ACTION_, dla WYCH — kolumna BLAD.

02

Jak szybko odnaleźć wywołania zakończone błędem?

Najprościej filtrem RESPONSE_STATUS >= 400, uzupełnionym o warunek na wartość pustą — brak statusu przy kierunku WYCH zwykle oznacza brak odpowiedzi usługi. Indeks na kolumnie RESPONSE_STATUS sprawia, że takie zapytanie działa szybko nawet przy milionach wpisów.

03

Czy rejestr można bezpiecznie czyścić?

Tak, ale warto robić to przez archiwizację, nie przez usunięcie. Wpisy starsze niż kilka miesięcy rzadko przydają się w diagnozie, natomiast bywają potrzebne przy sporze z kontrahentem o przebieg wymiany danych. Zalecane jest cykliczne przenoszenie ich do osobnej tabeli.

04

Dlaczego tabela zajmuje tak dużo miejsca?

Sześć kolumn ma typ varchar(max) i przechowuje pełne treści oraz nagłówki żądań i odpowiedzi. Przy intensywnej wymianie danych to główny konsument przestrzeni w bazie. Ograniczenie zapisywanej treści do rozsądnej długości albo skrócenie okresu przechowywania rozwiązuje problem.

Słownik pojęć

Słownik pojęć

Pojęcia z zakresu integracji systemów przez interfejsy programistyczne.

AAPI
Interfejs programistyczny, przez który dwa systemy wymieniają dane w czasie rzeczywistym. Pozwala zintegrować oprogramowanie magazynowe z ERP, sklepem lub przewoźnikiem.
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.
EEDI
Elektroniczna wymiana dokumentów w ustalonym formacie — zamówień, awizacji dostaw i faktur — bezpośrednio między systemami kontrahentów, bez ręcznego przepisywania.
ŚŚlad rewizyjny
Nieusuwalny zapis, kto i kiedy zmienił dane w systemie. Podstawa wiarygodności ewidencji podczas audytu i kontroli.
IIntegracja kurierska
Automatyczne przekazanie przesyłki do systemu przewoźnika wraz z wydrukiem etykiety i pobraniem numeru śledzenia.
KKopia zapasowa
Zabezpieczona kopia bazy danych pozwalająca odtworzyć stan systemu po awarii. W SQL Server wykonuje się ją w trybie pełnym, różnicowym lub jako kopię dziennika transakcji.

Zobacz to w praktyce

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