luktom.net
  • blog
  • kontakt
  • english





SQL Server – walidacja numerów PESEL i NIP

14 sie, 2011
SQL Server
4 komentarze
Odsłony : 85153

Tworząc ostatnio bazę danych, wymaganiem była weryfikacja po stronie bazy danych poprawności wprowadzenia numeru PESEL i NIP.

Sprawa sprowadza się do wyliczenia reszty z dzielenia – w przypadku numeru PESEL lub sumy kontrolnej – w przypadku NIPu.

W treści wpisu załączam gotowe funkcje T-SQL do weryfikacji tych numerów.

Funkcja do walidacji numerów PESEL:

CREATE FUNCTION IsValidPesel
(
	@pesel nchar(11)
)
RETURNS bit
AS
BEGIN

	IF ISNUMERIC(@pesel) = 0
		RETURN 0

	DECLARE
		@weights AS TABLE
		(
			Position tinyint IDENTITY(1,1) NOT NULL,
			Weight tinyint NOT NULL
		)

	INSERT INTO @weights VALUES (1), (3), (7), (9), (1), (3), (7), (9), (1), (3), (1)

	IF (SELECT SUM(CONVERT(TINYINT, SUBSTRING(@pesel, Position, 1)) * Weight) % 10 FROM @weights ) = 0
		RETURN 1

	RETURN 0

END

Oraz funkcja do walidacji numerów NIP:

CREATE FUNCTION IsValidNip
(
	@nip nvarchar(15)
)
RETURNS bit
AS
BEGIN

	SELECT @nip = REPLACE(@nip,'-','')

	IF ISNUMERIC(@nip) = 0
		RETURN 0

	DECLARE
		@weights AS TABLE
		(
			Position tinyint IDENTITY(1,1) NOT NULL,
			Weight tinyint NOT NULL
		)
	INSERT INTO @weights VALUES (6), (5), (7), (2), (3), (4), (5), (6), (7)

	IF SUBSTRING(@nip, 10, 1) = (SELECT SUM(CONVERT(TINYINT, SUBSTRING(@nip, Position, 1)) * Weight) % 11 FROM @weights)
		RETURN 1

	RETURN 0

END

Teraz wystarczy jedynie dodać check constraint do odpowiednich tabeli:

ALTER TABLE Users ADD CONSTRAINT checkPesel CHECK (dbo.IsValidPesel(PESEL) = 1)
ALTER TABLE Users ADD CONSTRAINT checkNip CHECK (dbo.IsValidNip(NIP) = 1)


Tagi :   nippeselsql serverwalidacja

Powiązane wpisy

  • „SQL Server ❤ Linux” – na PLSSUG Kraków – zapraszam

  • SmogBot – kilka dobrych praktyk z zakresu bezpieczeństwa bazy danych

  • Problem ze startem SQL Server Agent

  • „SQL Server w AWS” – na PLSSUG Kraków – zapraszam

  • 4 komentarze

    • Piotrek Reinmar Koszuliński sie 19 , 2011 at 02:11 /

      Jak spojrzałem na to to mi się przypomniał zeszły semestr na uczelni. Na jednym kursie robiliśmy aplikację, która miała wyglądać tak ładnie jak webowa, w Accessie (sic!) i tam musiałem w przecudownym VB pisać powyższe funkcje. Na drugim robiliśmy już trochę sensowniejsze rzeczy ale w T-SQL-u. Mnie, osobę, lekko mówiąc, nie przepadającą za produktami MS, bardzo bolało ;> A Ty przywróciłeś te wspomnienia łącząc tematy ;>

    • a wrz 08 , 2011 at 08:50 /

      sad

    • Akodo_Shado wrz 08 , 2011 at 09:16 /

      09 IF ISNUMERIC(@pesel) = 0
      10 RETURN 0

      ?? I działa? ;)
      Dodatkowo wcześniej warto sprawdzić czy nie jest null i czy ma 11 znaków.
      Dodatkowo przydałyby się dwa opcjonalne parametry.
      Data urodzenia i płeć i sprawdzić je w peselu jak są podane.

    • Adam paź 27 , 2020 at 13:24 /

      7742840242 jest poprawnym NIP, a Twoja funkcja uznała go za zły :(


    Dodaj komentarz

    Click here to cancel reply

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>





    Łukasz Tomaszkiewicz

    Łukasz Tomaszkiewicz

    Pasjonat chmury, szczególnie AWSa, który nieustannie automatyzuje powtarzające się czynności i optymalizuje procesy, przy okazji wdrażając dobre praktyki dotyczące bezpieczeństwa. Jego szerokie doświadczenie w zakresie tworzenia oprogramowania, projektowania baz danych, a także wirtualizacji serwerów i zarządzania infrastrukturą w chmurze pozwala mu spojrzeć przekrojowo na współczesny stack technologiczny.

    W wolnym czasie fotograf, sporadycznie piszący blogger :) a także regularny prelegent na krakowskich grupach związanych z IT.

    Wyznawca Vim'a :)

    Kategorie

    • Ansible
    • AWS
    • C#
    • Chatboty
    • Cloud
    • Daj się poznać 2017
    • Docker
    • Inne
    • Linux
    • Open source
    • Organizacyjne
    • Prelekcje
    • Sieci komputerowe
    • SQL Server
    • Windows
    • Windows Server
    • Wirtualizacja

    Najczęściej czytane

    • Creating single node VSAN cluster
    • Konfiguracja serwera DHCP na routerach Cisco
    • Aktywacja routingu IP w Windows 7 / Windows Server 2008
    • Konwersja maszyn wirtualnych z ESXi do Hyper-V przy użyciu SCVMM 2012
    • Jak podłączyć program R do SQL Servera?
    • Problem ze startem SQL Server Agent

    Tagi

    .net ai ansible asp.net mvc aws aws cli bot builder bot framework c# centos certyfikaty chatbot chatboty cisco cmd docker dsp2017 esxi hyperv kontenery konteneryzacja linux mvc nlp openvpn plssug pobieranie powershell prelekcje rancher redhat router sieci smogbot sql server ssd ssl vmware vsphere windows windows mobile windows server wirtualizacja wit.ai wrzuta

    Copyright © 2006-2018 by Łukasz Tomaszkiewicz. Wszelkie prawa zastrzeżone