SQL Server w logistyce

Tabela _send w bazie danych SQL Server

Kolejka wiadomości e-mail — treść, odbiorcy, szablon i liczba prób wysłania w jednym miejscu.

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
  • Wiadomość jest najpierw zapisywana do kolejki, a dopiero potem wysyłana — dzięki temu awaria serwera pocztowego niczego nie gubi.
  • Status w kolumnie ACH odróżnia wiadomość oczekującą od wysłanej, a licznik REPEAT zlicza próby.
  • Powiązanie przez REFNO_TEMPLATE i REFNO_GROUP pozwala grupować wysyłki i korzystać ze wspólnych szablonów.
  • Dziesięć indeksów obsługuje zarówno pracę usługi wysyłającej, jak i późniejsze ustalanie, czy wiadomość została nadana.

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

Powiadomienie o zmianie statusu reklamacji, potwierdzenie awizacji, raport wysyłany co rano — wszystkie one mają wspólną cechę: powstają w chwili, gdy system nie ma pewności, czy serwer pocztowy odpowie. Tabela [dbo].[_send] rozwiązuje to rozdzieleniem obu czynności. Wiadomość trafia najpierw do kolejki, a usługa wysyłająca zabiera ją stamtąd niezależnie.

Rozdzielenie daje trzy korzyści. Operacja użytkownika kończy się natychmiast, bo nie czeka na serwer pocztowy. Awaria łącza nie powoduje utraty powiadomienia — pozostaje ono w kolejce do czasu, aż wysyłka się powiedzie. A liczba prób zapisana w kolumnie REPEAT pozwala odróżnić wiadomość, która właśnie czeka, od tej, która nie może zostać nadana od trzech dni.

Wiersz zawiera komplet danych potrzebnych do nadania: trzy grupy odbiorców, temat, treść, adres zwrotny oraz konto nadawcze wskazane symbolem ze skorowidza. Znacznik SEND_AS_USER decyduje, czy wiadomość zostanie wysłana w imieniu użytkownika, który ją wywołał, czy z konta systemowego — różnica istotna wtedy, gdy odbiorca ma odpowiedzieć konkretnej osobie.

Droga powiadomienia od zdarzenia do skrzynki odbiorcy
Zdarzenie ZdarzenieZmiana statusu albo zadanie automatyczne tworzy wiadomość
Kolejka KolejkaWiersz zapisany ze statusem oczekiwania i wskazaniem szablonu
Wysyłka WysyłkaUsługa pobiera wiadomość i przekazuje ją serwerowi pocztowemu
Potwierdzenie PotwierdzenieZmiana statusu na wysłany albo zwiększenie licznika prób

Operacja użytkownika kończy się na drugim kroku — nie czeka na serwer pocztowy, więc awaria poczty nie blokuje pracy w systemie.

Budowa tabeli — wykaz kolumn

Dwadzieścia trzy kolumny dzielą się na treść wiadomości, jej adresatów, powiązania oraz metrykę wysyłki.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Treść i adresaci
SUBJECTvarchar(max)
tekst bez limitu długości
takTemat maila
MAIL_CONTENTvarchar(max)
tekst bez limitu długości
takTreść maila
EMAILvarchar(5000)
tekst do 5000 znaków
nieAdresy email odbiorców wiadomości
DWvarchar(150)
tekst do 150 znaków
nieAdresy email odbiorców „do wiadomości”
UDWvarchar(150)
tekst do 150 znaków
nieAdresy email odbiorców „ukryte do wiadomości”
REPLY_TOvarchar(150)
tekst do 150 znaków
takAdres odpowiedzi
KONTO_MAILvarchar(5)
tekst do 5 znaków
nieKonto mailowe ze skorowidza KEML
SEND_AS_USERbit
wartość logiczna 0/1
takFlaga wskazująca, czy e-mail powinien być wysłany w imieniu użytkownika
Powiązania
REFNObigint
liczba całkowita 64-bitowa
takNumer referencyjny wysyłki
REFNO_GROUPbigint
liczba całkowita 64-bitowa
takIdentyfikator grupy
REFNO_TEMPLATEbigint
liczba całkowita 64-bitowa
takIndentyfikator szablonu mailowego
PRXvarchar(5)
tekst do 5 znaków
takIdentyfikator grupy rekordów
FIRMAvarchar(20)
tekst do 20 znaków
nieIdentyfikator firmy
ODDZIALvarchar(5)
tekst do 5 znaków
nieIdentyfikator oddziału osoby dokonującej zapisu w bazie
MPKvarchar(20)
tekst do 20 znaków
nieSymbol miejsca powstawania kosztów
ROLASYSvarchar(3)
tekst do 3 znaków
nieIdentyfikator roli
Stan wysyłki
ID_SENDint
liczba całkowita
takUnikalny identyfikator wiersza tabeli
ACHvarchar(1)
tekst do 1 znaków
takJednoznakowe oznaczenie stanu danego wiersza w tabeli: 0-bufor, 1-zatwierdzony, X-usunięty
REPEATint
liczba całkowita
takIlość prób wysłania maila
KIEDYdatetime
data i godzina
takData i godzina dopisania rekordu w bazie
DDOWODdate
data
nieData zapisania dokumentu
LOGINvarchar(50)
tekst do 50 znaków
nieLogin użytkownika dokonującego zapisu w bazie
STAMPtimestamp
znacznik wersji wiersza
takWewnętrzny identyfikator aktualizacji wiersza

Kolumna EMAIL mieści pięć tysięcy znaków, a więc setki adresów. Przy wysyłkach masowych warto jednak rozważyć osobne wiersze dla każdego odbiorcy — inaczej jeden nieprawidłowy adres potrafi zablokować całą wiadomość.

Indeksy i wydajność zapytań

Dziesięć indeksów to nietypowo dużo jak na jedną tabelę i wynika z dwóch odmiennych sposobów jej używania.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
ACHACHzwykły
DDOWODDDOWODzwykły
KIEDYKIEDYzwykły
LOGINLOGINzwykły
PK_sendID_SENDklucz główny
PRXPRXzwykły
REFNOREFNOzwykły
REFNO_GROPUREFNO_GROUPzwykły
REFNO_GROUP_REFNO_TEMPLATEREFNO_GROUP, REFNO_TEMPLATEzwykły
REFNO_TEMPLATEREFNO_TEMPLATEzwykły

Pierwszy zbiór — indeksy na ACH, KIEDY i REPEAT — obsługuje usługę wysyłającą, która co kilkadziesiąt sekund pyta o wiadomości oczekujące. Drugi, oparty na REFNO, REFNO_GROUP i REFNO_TEMPLATE, służy późniejszym pytaniom: czy powiadomienie o tej reklamacji zostało wysłane i kiedy. Taka liczba indeksów ma swoją cenę przy zapisie, ale kolejka jest odczytywana znacznie częściej, niż zapisywana.

Wiadomość nie dotarła — od czego zacząć

Zgłoszenie „nie dostałem powiadomienia” ma kilka możliwych przyczyn, a kolejka pozwala szybko zawęzić je do jednej.

Rozpoznanie przyczyny braku wiadomości
Co widać w tabeliCo to oznaczaGdzie szukać dalej
Brak wierszaWiadomość w ogóle nie powstałaKonfiguracja zdarzenia albo warunek w zadaniu automatycznym
Wiersz ze statusem oczekiwania, REPEAT = 0Czeka na najbliższy przebieg usługiNic — wystarczy odczekać
REPEAT rośnie, status bez zmianSerwer pocztowy odrzuca wiadomośćRejestr błędów i konfiguracja konta nadawczego
Status wysłany, odbiorca nie ma wiadomościNadanie się powiodło, problem po stronie odbiorcyFiltr antyspamowy, poprawność adresu
Adres w kolumnie EMAIL wygląda inaczej niż oczekiwanoBłąd w danych źródłowychKartoteka kontrahenta lub konto użytkownika

Trzeci wiersz jest najczęstszy przy nowo uruchomionej integracji — zwykle wskazuje na brak autoryzacji konta nadawczego.

Warto ustawić prosty próg alarmowy: zapytanie zliczające wiadomości z licznikiem prób powyżej trzech, uruchamiane raz dziennie. Rosnąca liczba takich wierszy oznacza, że wysyłka przestała działać — a to sytuacja, o której nikt nie zgłosi, bo brak powiadomienia jest z natury niewidoczny.

Jak korzystać z tabeli w praktyce

Przy utrzymaniu kolejki wiadomości sprawdzają się poniższe zasady:

  • Monitoruj wiersze z wysoką wartością REPEAT — to jedyny sygnał, że wysyłka przestała działać.
  • Twórz osobne wiersze dla poszczególnych odbiorców przy wysyłkach masowych; jeden błędny adres nie zablokuje wtedy pozostałych.
  • Ustawiaj SEND_AS_USER tam, gdzie odbiorca ma odpowiedzieć konkretnej osobie, a nie na skrzynkę systemową.
  • Korzystaj z REFNO_TEMPLATE zamiast wpisywać treść bezpośrednio; zmiana szablonu obejmie wtedy wszystkie przyszłe wysyłki.
  • Archiwizuj wiadomości wysłane starsze niż kilka miesięcy — kolumna z treścią ma typ varchar(max) i szybko rośnie.
  • Nie usuwaj wierszy oczekujących w celu „odblokowania” kolejki; najpierw ustal, dlaczego nie zostały nadane.

Kontrola kolejki: wiadomości oczekujące dłużej niż godzinę oraz te, przy których próby wysyłki się powtarzają:

SELECT  ID_SEND,
        KIEDY,
        LEFT(EMAIL, 60)   AS ODBIORCA,
        LEFT(SUBJECT, 60) AS TEMAT,
        REPEAT            AS PROB,
        DATEDIFF(MINUTE, KIEDY, GETDATE()) AS CZEKA_MINUT
FROM    dbo._send
WHERE   ACH <> '1'
  AND   KIEDY < DATEADD(HOUR, -1, GETDATE())
ORDER BY REPEAT DESC, KIEDY;

Wiersze z licznikiem prób powyżej trzech zasługują na osobną uwagę — zwykle wskazują na problem z kontem nadawczym, a nie z pojedynczą wiadomością.

Kolejka wiadomości należy do mechanizmów, których awaria jest niewidoczna. Nikt nie zgłosi, że nie dostał powiadomienia, którego się nie spodziewał — dlatego jedno zapytanie kontrolne uruchamiane codziennie jest tu wart więcej niż rozbudowana konfiguracja.

Powiązane tabele i dokumentacja

Kolejka e-mail działa razem z pozostałymi mechanizmami powiadamiania i automatyzacji:

FAQ

Najczęściej zadawane pytania o tabelę _send

01

Dlaczego wiadomości są kolejkowane, a nie wysyłane od razu?

Żeby operacja użytkownika nie zależała od dostępności serwera pocztowego. Zapis do kolejki trwa milisekundy, a wysyłką zajmuje się osobna usługa. Dzięki temu awaria poczty nie blokuje pracy w systemie, a powiadomienie nie ginie — pozostaje w kolejce do czasu, aż wysyłka się powiedzie.

02

Co oznacza rosnąca wartość w kolumnie REPEAT?

Że wysyłka była już próbowana i się nie powiodła. Pojedyncza próba bywa przypadkiem, ale wartość powyżej trzech niemal zawsze wskazuje na problem systemowy — najczęściej brak autoryzacji konta nadawczego albo odrzucenie przez serwer odbiorcy. Warto ustawić na to zapytanie kontrolne.

03

Kiedy stosować znacznik SEND_AS_USER?

Gdy odbiorca ma odpowiedzieć konkretnej osobie, a nie na skrzynkę systemową. Wiadomość jest wtedy nadawana w imieniu użytkownika, który ją wywołał. Przy powiadomieniach automatycznych — raportach, monitach o terminach — właściwe jest natomiast konto systemowe.

04

Dlaczego tabela ma aż dziesięć indeksów?

Bo służy dwóm różnym celom. Indeksy na statusie i czasie obsługują usługę wysyłającą, która co kilkadziesiąt sekund pyta o wiadomości oczekujące. Indeksy oparte na numerach referencyjnych odpowiadają na późniejsze pytania w rodzaju „czy powiadomienie o tej reklamacji zostało wysłane”. Kolejka jest odczytywana znacznie częściej, niż zapisywana, więc koszt utrzymania indeksów się zwraca.

Słownik pojęć

Słownik pojęć

Pojęcia związane z powiadamianiem użytkowników i kontrahentów.

PPowiadomienia SMS i e-mail
Automatyczne komunikaty wysyłane po zajściu zdarzenia w systemie — potwierdzeniu awizacji, zmianie statusu reklamacji czy zbliżającym się terminie przeglądu.
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.
OObieg dokumentów
Zdefiniowana ścieżka, którą dokument przechodzi między stanowiskami wraz z wymaganymi akceptacjami. Ustala kolejność i odpowiedzialność.
RReklamacja
Zgłoszenie niezgodności towaru lub usługi. Wymaga rejestracji, nadania statusu, dotrzymania terminu odpowiedzi i udokumentowania decyzji.
AAwizacja
Wcześniejsze zgłoszenie przyjazdu pojazdu do magazynu wraz z rezerwacją okna czasowego przy rampie. Ogranicza kolejki i pozwala rozłożyć pracę w ciągu dnia.
MMPK
Miejsce powstawania kosztów — jednostka organizacyjna, do której przypisuje się wydatki. Pozwala rozliczyć koszty w podziale na działy.
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.