[ Valerij Zajcev @ 10.05.2009. 18:18 ] @
Hocu da napravim funkcionalnost koja registruje korisnika imam tabele User (ime, prezime ...) UserLogin(userid, usename, password), i sada hocu kada unesem username, password, ime, prezime da mi se ovaj korisnik doda u tabele User i UserLogin. Ne znam kako da li ima neki automatski nacin da se ovo izvrsi ili kako sam ja to zamislio mada nije nesto izvrsi se unos korisnika u User pa se uzme poslednji dodat (koji je on u stvari) tj. njegov userID i njega smestim u promenljivu i smestim u UserLogin... tupavo resenje mislim :)
[ .:Marvin:. @ 11.05.2009. 09:14 ] @
Cek cek, ti ovo radis sve direktno iz SQL Servera (Query Analizer, Management studio...) ??? Ili iz neke aplikacije?

U oba slucaja ima resenja, samo ovo definisi... :)
[ Fedya @ 11.05.2009. 09:38 ] @
Code:

CREATE PROCEDURE CreateUser
(
    @name nvarchar(100),
    @userName nvarchar(100),
    @password nvarchar(100)
    -- I svi drugi parametri koji ti trebaju
)
AS
DECLARE @userId bigint

BEGIN TRANSACTION
    INSERT INTO [User] VALUES (@name)

    SELECT @userId = SCOPE_IDENTITY()

    INSERT INTO [UserLogin] VALUES (@UserId, @userName, @password)
COMMIT


Naravno treba da prosiris sa proverom ispravnosti, radis rollback ako nesto pukne itd. (Mozda ima gresaka, nemoj kopirati kod, samo ga koristi kao referencu)
[ Valerij Zajcev @ 11.05.2009. 10:04 ] @
Citat:
.:Marvin:.: Cek cek, ti ovo radis sve direktno iz SQL Servera (Query Analizer, Management studio...) ??? Ili iz neke aplikacije?

U oba slucaja ima resenja, samo ovo definisi... :)

Za sada me zanima samo kako da napravim u SQL ManagemantStudio-u, mada istovremeno testiram i na servisu.

Citat:
Fedya:
Code:

CREATE PROCEDURE CreateUser
(
@name nvarchar(100),
@userName nvarchar(100),
@password nvarchar(100)
-- I svi drugi parametri koji ti trebaju
)
AS
DECLARE @userId bigint

BEGIN TRANSACTION
INSERT INTO [User] VALUES (@name)

SELECT @userId = SCOPE_IDENTITY()

INSERT INTO [UserLogin] VALUES (@UserId, @userName, @password)
COMMIT


Naravno treba da prosiris sa proverom ispravnosti, radis rollback ako nesto pukne itd. (Mozda ima gresaka, nemoj kopirati kod, samo ga koristi kao referencu)


Da da ovako nekako sam i ja mislio, nego sam mislio da nema mozda neki bolji nacin, pa da ne srljam bezveze.
Sta je SCOPE_IDENTITY()?
I da ja sam prilikom vezivanja tabela stavio update i delete rule na cascade, sta mi ovo konkretno omogucava?
[ Fedya @ 11.05.2009. 13:01 ] @
Citat:
Valerij Zajcev: Sta je SCOPE_IDENTITY()?


SCOPE_IDENTITY ti vraća polednje unetu vrednost u tabelu koja ima Identity polje, i to radi samo unitar trenutnog batcha (za razliku od @@identity koji vraća poslednji uneti ID na nivou baza, tako da sa njim možeš dobiti pogrešnu vrednost u slučaju da dve transakcije kreiraju zapise u isto vreme).

Citat:
Valerij Zajcev: I da ja sam prilikom vezivanja tabela stavio update i delete rule na cascade, sta mi ovo konkretno omogucava?


Ako imaš vezu roditelj/dete postoji problem šta ako se roditelj obriše ili mu se vrednost ključa promeni. Kada staviš cascade delete i obrišeš roditelja server će obrisati sve zapise koji referišu tog roditelja. Kod update ti je slično samo što ce se zapis promeniti a ne obrisati.
Ovo je vrlo moćno i korisno, ali moraš biti siguran u to što radiš inače lako možeš obrisati nešto što ne želiš, i budi siguran da je svako ko želi nešto da obriše svestan da će to obrisati još mnogo toga.
[ mmix @ 11.05.2009. 13:54 ] @
@@identity vraca poslednji generisani ID u konekciji/sesiji, ne na nivou baze. cak iako radis sa dve i vise baza u okviru jedne skripte @@identity ce biti poslednji ID generisan u poslednjem insert-u bez obzira na to koja je baza. scope_identity je upravo ono sto mu ime kaze, poslednji ID generisan u scope-u skripte u kojoj se poziva. Poslednji ID generisan za tabelu bez obzira na konekciju je zapravo IDENT_CURRENT(tabela)