[ TasmanF1 @ 30.06.2013. 22:37 ] @
Pozdrav narode, problem je sledeci
Napisao sam update trigger koji proverava odredjene uslove, pa u zavisnosti od toga update-uje odredjene vrednosti...
Triger se poziva na:
Code:

UPDATE Podaci
SET podatakA = 1, podatakB = 2, podatakC = 3, podatakD = 4;


Kod za trigger:
Code:

CREATE TRIGGER ProveraUnosa
ON Podaci
AFTER UPDATE
AS
DECLARE
@brojA_stari int,
@brojB_stari int,
@brojC_stari int,
@brojD_stari int,
@brojA_novi int,
@brojB_novi int,
@brojC_novi int,
@brojD_novi int,
@brojKolona int

SELECT @brojA_stari = d.podatakA, @brojB_stari = d.podatakB, @brojC_stari = d.podatakC,
       @brojD_stari = d.podatakD, @brojA_novi = i.podatakA, @brojB_novi = i.podatakB,
       @brojC_novi = i.podatakC, @brojD_novi = i.podatakD
FROM deleted d, inserted i

    IF(@brojA_stari != @brojC_stari)
    BEGIN
        PRINT N'Ispunjen je uslov za vrednost B, tako da ce ta vrednost biti azurirana';
        BEGIN TRANSACTION TransakcijaB
        UPDATE Podaci
        SET podatakB = @brojB_novi;
        COMMIT TRANSACTION TransakcijaB
    END

    IF(@brojA_novi = @brojA_stari)
    BEGIN
        PRINT N'Ispunjen je uslov za vrednost A, tako da ce ta vrednost biti azurirana';
        BEGIN TRANSACTION TransakcijaA
        UPDATE Podaci
        SET podatakA = @brojA_novi;
        COMMIT TRANSACTION TransakcijaB
    END

    IF(@brojC_novi < @brojB_novi)
    BEGIN
        PRINT N'Ispunjen je uslov za vrednost C, tako da ce ta vrednost biti azurirana';
        BEGIN TRANSACTION TransakcijaC
        UPDATE Podaci
        SET podatakC = @brojC_novi;
        COMMIT TRANSACTION TransakcijaB
    END
    BEGIN TRANSACTION TransakcijaD
    UPDATE Podaci
    SET podatakD = @brojD_novi;
    PRINT N'Ispunjen je uslov za vrednost D, tako da ce ta vrednost biti azurirana';
    COMMIT TRANSACTION TransakcijaD


Stvar je u tome sto se bez obzira na provere uslova izvrsi cela update transakcija, tako da se azuriraju sve 4. vrednosti.
Kako da izvrsim samo update onih vrednosti za koje su ispunjeni uslovi?
Neko razmisljanje je da bi nakon komitovanja "TransakcijaD" trebao da zaustavim glavnu transakciju (koja dolazi od update poziva), ali ne znam kako...
Sa ROLLBACK se nista nece azurirati.
Probao sam i sa SAVE TRANSACTION ali ni to mi ne radi posao, ili prosto ne znam gde da postavim SAVE.

ps.
Ove transakcije (TransakcijaA, TransakcijaB, TransakcijaC, TransakcijaD) sam pravio kad vec nisam imao nikakvu ideju...
[ TasmanF1 @ 30.06.2013. 23:21 ] @
Ukoliko u trigeru pre pocetka provere uslova odradim ROLLBACK (to je koliko kontam ROLLBACK za transakciju koja se odnosi na Update upit koji pozva trigger), a sve if uslove stavim u novu transakciju onda mi radi tacno kako treba.
E sad verujem da postoje i "kulturniji" nacin za resevanje problema?