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;
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
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...