[ flighter_022 @ 24.05.2008. 03:48 ] @
Procedura prvo dodaje slogove u bazu (primer) a zatim preko kurzora radi dodatnu obradu sa upisivanjem u neku trecu tabelu

Code:
BEGIN TRAN

DECLARE @p1 int, @p2 int

INSERT INTO Tabela1
                    (Polje1,
                    Polje2)
SELECT          Abc,
                    Def
FROM            Tabela2
WHERE          <neki uslov>

DECLARE        cursor1 CURSOR FOR
SELECT         Tabela1.Polje1, Tabela1.Polje2
FROM          Tabela1
WHERE        <neki uslov>
   
OPEN cursor1

FETCH    NEXT From Cursor1
INTO    @p1, @p2

WHILE    @@FETCH_STATUS =0
BEGIN
    <neka obrada podataka>    
    FETCH    NEXT From Cursor1
        INTO    @p1, @p2
END
CLOSE        cursor2
DEALLOCATE    cursor2
COMMIT TRAN


E sad, ako tokom dela gde se koristi kurzor dodje do greske, podaci upisani sa INSERT INTO ipak ostanu u bazi (jer u tom delu nije bilo greske). Kako da postignem da sve izmene u bazi (i one sa INSERT INTO, i one unutar kurzorske operacije) budu obuhvacene istom transakcijom?
[ M E N E @ 24.05.2008. 09:03 ] @
hm
predlazem ti da koristis try-catch blok
pa da brises ako dodje do greske
(mozda je glupavo resenje, ali prvo mi je palo na pamet)

[ flighter_022 @ 24.05.2008. 13:03 ] @
Videh to u dokumentaciji ali sam mislio da mozda postoji jednostavnije resenje.

Hvala.
[ vujkev @ 25.05.2008. 00:10 ] @
možeš da probaš i sa

Code:
BEGIN TRAN
....
IF @@ERROR = 0 
COMMIT TRAN
else
rollback


nisam 100% siguran da će raditi, ali
[ flighter_022 @ 25.05.2008. 14:28 ] @
Ovo vredi probati.
[ Koce @ 26.05.2008. 12:19 ] @
mislim da nece, jer ce pri prvoj gresci on uraditi rollback!
moraces koristiti try - catch.....
[ deerbeer @ 27.05.2008. 08:53 ] @
Citat:
Koce: mislim da nece, jer ce pri prvoj gresci on uraditi rollback!
moraces koristiti try - catch.....


Pa to je i poenta RollBack transakcije da vrati sve izmene koje su napravljene ..
Mora da prodju svi INSERT-i ili nijedan ako sam dobro shvatio odavde :

Citat:
@flighter_022
E sad, ako tokom dela gde se koristi kurzor dodje do greske, podaci upisani sa INSERT INTO ipak ostanu u bazi (jer u tom delu nije bilo greske). Kako da postignem da sve izmene u bazi (i one sa INSERT INTO, i one unutar kurzorske operacije) budu obuhvacene istom transakcijom?


Ako koristis SQL2000 onda ces morati da testiras sa @@ERROR jer
ako radis na SQL2005 onda mozes koristiti i TRY-CATCH

Pogledaj na ovom linku imas error handling u stored procedurama :
http://www.4guysfromrolla.com/webtech/041906-1.shtml
[ negyxo @ 27.05.2008. 10:34 ] @
Pazite sa tom @@ERROR promenljivom, problem moze biti ako se ne proverava svaki upit, jer recimo:

Code:

BEGIN TRAN

INSERT T1 -- ovde je recimo error, samo ova klauzula puca, ne cela transakcija

INSERT T2 

IF @ERROR = 0 
  COMMIT TRAN -- uradice se commit, jer prethodni insert nije generisao gresku
ELSE
  ROLLBACK TRAN




Koristite SET XACT_ABORT ili TRY CATCH ili @ERROR ali onda proveravajte svaku klauzulu.
[ deerbeer @ 27.05.2008. 10:38 ] @
Naravno ....
@@ERROR promenljiva se "resetuje" pri svakom sledecem izvrsavanju nekog inserta,update-a i delete-a
[ Koce @ 27.05.2008. 15:01 ] @
ma da, sad sam vidio da on u stvari hoce da se izbirse i ono sto je insertovao, ja sam mislio da to ne zeli da mijenja.... rollback ce sigurno sve da vrati na pocetno