tworzenie tabeli z default wartością z innej kolumny.

0
CREATE TABLE RCP.Pracownik
(	
	ID_prac INT not null identity(1,1) PRIMARY KEY
	,Imie varchar(15) not null
	,Nazwisko varchar(20) not null
	,pesel int DEFAULT CONCAT(RIGHT(CONVERT(varchar(10),convert(date,data_urodzenia,112),112),6),RIGHT(rand(),5)) UNIQUE
	,data_urodzenia date CONSTRAINT cre_date CHECK (DATEDIFF(YEAR,data_urodzenia,CONVERT(DATE,GETDATE(),121))>18)
	,Ulica varchar(15) not null
	,Miasto varchar(15) not null
	,Nr_domu int not null
	,Nr_mieszkania int null
	,Nr_tel integer
	,Stanowisko varchar(15) not null
)

Cześć,

Chcialbym coś takiego zrobić jak powyżej, czyli że wartość w kolumnie pesel tworzy sie na podstawie kolumny daty urodzenia.
Nie chce tworzyc przy insercie zadnych trigerów czy coś w tym stylu.

Jest to jakoś wykonalne?

0

Przecież wyzwalacz (trigger) będzie najbardziej eleganckim wyjściem i skutecznym. Nie słyszałem o takiej możliwości, ale może bardziej doświadczeni koledzy się wypowiedzą.

0

No wiem, że wyzwalacz spełniłby tu swoją rolę, ale gdyby była opcja załatwić to bez wyzwalacza to po co tworzyć nowy obiekt :)

0

leon, ale ja tu czegoś nie rozumiem, wartość domyślna to wartość przy nowym rekordzie kiedy jeszcze nie masz wpisanej daty urodzenia. Takie rzeczy to tylko triggerem.

0

default tego nie załatwi - tylko trigger

0

Skoro wstawiasz tam Rnd(), to po co ci w ogóle ta kolumna? Przecież skoro to nie jest prawdziwa wartość, to równie dobrze może być fejkowa za każdym zapytaniem... Czyli albo computed column, albo view. Skoro nie chcesz triggera. A i ten nie jest w stanie na podstawie TYLKO daty urodzenia wyznaczyć PRAWIDŁOWY PESEL.

1

Jeśli już bardzo nie chcesz zakładać triggera to można założyć kolumnę wyliczalną. Tylko nie rozumiem istoty uzupełniania peseli przez RAND().

CREATE TABLE #Pracownik
(    
    ID_prac INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    ,data_urodzenia DATE CONSTRAINT cre_date CHECK (DATEDIFF(YEAR,data_urodzenia,CONVERT(DATE,GETDATE(),121))>18)
    ,rnd INT
    ,pesel as (CAST(RIGHT(CONVERT(VARCHAR(10), data_urodzenia, 112),6)+CAST(rnd AS VARCHAR(5)) AS BIGINT)) PERSISTED
)
ALTER TABLE #pracownik ADD CONSTRAINT UIX_pracownik_pesel UNIQUE (pesel)

INSERT INTO #Pracownik (data_urodzenia,rnd)
SELECT '19910101',right(rand(),5)


SELECT pesel FROM #Pracownik

DROP TABLE #Pracownik
0

Vardamir Dzięki :) skorzystałem z Twojej odpowiedzi.
Szczerze mówiąc nie słyszałem o tym PERSISTED wcześniej, jakoś nie było okazji.

pozdrawiam i zamykam temat :)

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