Ukratko, treba mi primjer stored procedure koja kao parametre prima jedan zapis i njega zapisuje negdje u bazu. Jedan od parametara treba biti i timestamp (rowversion), i ono što zapravo trebam jest da stored procedura pomoću timestampa izbaci exception na klijentskoj strani ako je došlo do data konkurencije (provjera se vrši usporedbom tipestampa u stored proceduri). Riječ je o SQL serveru.
Stored procedura
- poruka: 8
- |
- čitano: 2.874
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Ukratko, treba mi primjer stored procedure koja kao parametre prima jedan zapis i njega zapisuje negdje u bazu. Jedan od parametara treba biti i timestamp (rowversion), i ono što zapravo trebam jest da stored procedura pomoću timestampa izbaci exception na klijentskoj strani ako je došlo do data konkurencije (provjera se vrši usporedbom tipestampa u stored proceduri). Riječ je o SQL serveru.
Stored procedure ne izbacuju exceptione i nemaju veze s klijentima, već se izvršavaju na serveru. Ono što možeš dobiti je potvrda o grešci od SQL servera. Također, SP ne primaju zapise, nego parametre u tipovima baze.
Dakle, da bi dobio to što tražiš, trebaš parsati i proslijediti parametre koje želiš i parsati i klasificirati ili direktno izbaciti eventualnu grešku na serveru.
Ako se ne varam SQL Server od verzije 2005 podržava try cach throw
Ako se ne varam SQL Server od verzije 2005 podržava try cach throw
Djelomično si u pravu, ali ne u onom dijelu koji njega zanima. U SQL Serveru možeš specificirati TRY CATCH, ali to znači samo da možeš definirati alternativne operacije ako ono unutar TRY-a ne uspije. Bez obzira na to, poruke o greškama i dalje parsaš u aplikaciji, s razlikom da ti se aplikacijska rutina neće prekinuti greškom u bazi.
Ukratko, treba mi primjer stored procedure koja kao parametre prima jedan zapis i njega zapisuje negdje u bazu. Jedan od parametara treba biti i timestamp (rowversion), i ono što zapravo trebam jest da stored procedura pomoću timestampa izbaci exception na klijentskoj strani ako je došlo do data konkurencije (provjera se vrši usporedbom tipestampa u stored proceduri). Riječ je o SQL serveru.
Stored procedure ne izbacuju exceptione i nemaju veze s klijentima, već se izvršavaju na serveru. Ono što možeš dobiti je potvrda o grešci od SQL servera. Također, SP ne primaju zapise, nego parametre u tipovima baze.
Dakle, da bi dobio to što tražiš, trebaš parsati i proslijediti parametre koje želiš i parsati i klasificirati ili direktno izbaciti eventualnu grešku na serveru.
Naredba raiserror "baca" ono što ja u klijentu hvatam s try-catch tj. exception. I kada sam napisao "zapis" onda i mislim na sve njegove dijelove koji su predani kao parametri. Također, iako se stored procedura izvršava na serveru ne može se reći da klijent nema veze s njom, jer ja kao klijent tu proceduru i pozivam, te radim s njenim result setom.
I molim, bez nepotrebne filozofije. Trebam samo konkretan primjer usporedbe timestampa (onog u bazi i dolaznog preko parametra). Zapisi se identificiraju primarnim ključem ID (increment). Hvala.
U redu, to jest arhitekturala filozofija.
Ali vidim da znaš za RAISERROR. Ako to znaš, gdje je problem? U SQL-u se polja uspoređuju sa znakom "=".
Problem je u sljedećem. Ja predam stored proceduri ovakve paramtre: ID, IME, PREZIME, TIMESTAMP. I sada ta procedura treba pronaći zapis s tim ID-om (nije problem upotrebom select-a), i ako ga ne nađe onda dodaje novi zapis s tim parametrima. Međutim, ako nađe zapis s tim ID-om onda ga treba izmjeniti tako da promjeni stupce IME i PREZIME (postavi ih na vrijednosti predane parametrima). Međutim niti to ne smije napraviti ako je klijentski timestamp (onaj iz parametara) "manji" od onog koji je trenutno na serveru (postojećem zapisu u tablici) tj. ako je netko drugi od klijenata već izmjenio zapis na serveru. Tada treba izbaciti taj exception.
Znači, treba mi realizacija klasičnog data concurrency problema upotrebom stored procedure. Inače ovaj problem rješavam automatski kroz try-catch na klijentu, ali tada moram usporedbom stringova analizirati što se dogodilo, umjesto da imam neki id pogreške, što želim postići tom stored procedurom.
Neznam dali sam pogodio priču ali probajmo:
use [ImeBaze]
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'procNameProcedure')
BEGIN
DROP Procedure dbo.procNameProcedure
END
GO
CREATE Procedure dbo.procOraRacunStavkeReport
@id int,
@FirstName varchar(50),
@LastName varchar(50),
@CreateTime timestamp,
@Result int output
AS
begin
declare @count int;
declare @baseTime datetime;
set @count=(select count(*) from imeTablice where id=@id);
if @count > 0 then
begin
set @baseTime=(Select top 1 Time from imeTablice where id=@id);
if @baseTime<@CreateTime then
begin
update imeTablice
set
FirstName=@FirstName,
LastName=@LastName,
Time=@CreateTime
where
id=@id;
set @Result=rowcount();
end
else
begin
set @Result=-1;
end
end
else
begin
insert into imeTablice
values(@id,@FirstName,@LastName,@Time);
set @Result=0;
end
end