Numeracja w MS SQL Server

0

Chcę stworzyć tabelę, która będzie przechowywała rejestry.
Obawiam się, że 2 użytkowników w tym samym czasie może dodać nowy dokument i powieli się nr.
Czy jeżeli procedura inkrementująca numer będzie zakładała transakcję to wyeliminuję ryzyko nadania takiego samego numeru?
Zastanawiam się czy powinienem ustawić jakiś konkretny stopień izolacji.

Jakie rozwiązania stosowaliście dotychczas?

4

Załóz unique na tej kolumnie.

0

Nie myślałem o unique, bo w rejestrze znajduje się nr/rok/typ_pisma.
Nie mniej chyba faktycznie warto zrobić CONSTRAINT C_NumberYearTypeId UNIQUE (Number, Year, TypeId), a procedura będzie zakładała transakcję tak czy inaczej - nie zaszkodzi, a mniejsza szansa na błąd tworzenia dubla.
Dzięki. :)

0
nano50 napisał(a):

Nie myślałem o unique, bo w rejestrze znajduje się nr/rok/typ_pisma.
Nie mniej chyba faktycznie warto zrobić CONSTRAINT C_NumberYearTypeId UNIQUE (Number, Year, TypeId), a procedura będzie zakładała transakcję tak czy inaczej - nie zaszkodzi, a mniejsza szansa na błąd tworzenia dubla.
Dzięki. :)

Inkrementację jako max z już istniejącego ? Tak naprawdę zrobić potrzebujesz zrobić locka na tabeli z rejestrami.

0
nano50 napisał(a):

Obawiam się, że 2 użytkowników w tym samym czasie może dodać nowy dokument i powieli się nr.

To zależy od tego kiedy nadajesz numer dokumentu. Jeśli od razu po wyświetleniu okna dopisu dokumentu, czy bezpośrednio przed samym wysłaniem danych np. w triggerze.

Pamiętaj, że jak chcesz pokazać numer dokumentu od razu po wyświetleniu okna dopisu nowego dokumentu, to trzeba wziąć pod uwagę fakt, że użytkownik może wprowadzać dane długo, może odebrać w tym momencie telefon i gadać 30 minut i co wtedy? W tym czasie 10 innych użytkowników wprowadza swoje dokumenty i aktualny numer będzie zajęty i co się wtedy ma dziać?. Możesz wyświetlać nr dokumentu informacyjnie, ale bezpośrednio przed zapisem trzeba by pobrać nowy numer. Jeśli nie chcesz tak robić, to możesz zapisać z danym numerem widniejącym w oknie, a obsłużyć wyjątek naruszenia klucza unique i w tym wypadku nadać nowy numer. Ale to rozwiązanie jest raczej mało eleganckie. Jednak indeks unikalny musi być zawsze założony. Niech baza zajmie się pilnowaniem unikalności numeracji. W przypadku faktur to bardzo ważne, więc lepiej aby sama baza zadbała to to.

Jak również nie możesz robić tak, że po dokonaniu otwarcia okna dopisu dokumentu zajmujesz dany numer, bo użytkownik może zmienić zdanie, anulować dokument i zostaniesz z dziurą w numeracji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1