[ spirit_vb @ 18.02.2012. 16:42 ] @
Imam problem sa UPDATE trigerom u t-SQL,
imam model kako na slici tj.

Obrazac(IDObrasca, datum, JMBG, imePrezime, PTTBroj, nazivMesta, nazivUlice)
Pacijent(JMBG, imePrezime, PTTBroj, nazivMesta, redniBroj, nazivUlice, brojUUlici)
Mesto(PTTBroj, nazivMesta)
Ulica(redniBroj, PTTBroj, nazivUlice, brojUUlici)

pokusavam da napravim triger nad tabelom Pacijent, koji kada promenim PTTBroj i redniBroj, menja i zavisne atribute nazivmesta, nazivUlice, brojUUlici na osnovu tabela Mesto i Ulica, ali imam problem sa "inserted" i "deleted" logickim tabelama, naime one se ne mogu update-ovati onako kako ja hocu, ne znam da li je neki ima neko drugo resenja ali ovo definitvno ne radi...


ALTER TRIGGER [dbo].[TRG_PACIJENT]
ON [dbo].[Pacijent]
FOR UPDATE
AS
IF ( UPDATE (PTTBroj) AND UPDATE (redniBroj) )
BEGIN
UPDATE inserted
SET inserted.nazivMesta = mesto.nazivMesta
FROM mesto, inserted
WHERE inserted.PTTBroj = mesto.PTTBroj;
END


Da li neko ima neku ideju posto sam nov u ovoj Tsql prici...
Unapred hvala

[img]http://imageshack.us/photo/my-images/99/slikad.jpg/[/img]
[ HladankaoLed @ 18.02.2012. 22:45 ] @
Pre nego sto krenes u neku akciju sa trigerom, trebalo bi malo izanalizirati dizajn ovih tabela. Atribut PTTBroj pojavljuje se u sve cetiri tabele, nazivMesta i nazivUlice u po tri... Informacija o jednom atributu trebalo bi da bude sacuvana na tacno jednom mestu u bazi podataka. Ukoliko je to slucaj onda nema potrebe ni za kakvom sinhronizacijom atributa iz vise tabela pomocu trigera.

Umesto dve tabele Mesto i Ulica mogao bi da napravis jednu tabelu Adresa. Adresa postoji nezavisno od pacijenta i obrasca, stoga mozes da je napravis bez ikakvih referenci na ove tabele.

Za pacijenta od informacija imas JMBG, ime i adresu. Stoga ta tabela treba da sadrzi tri kolone: JMBG, ime i IDAdrese. Znaci ako su ovo redovi iz tabele Adresa:
Code:
 
 IDAdresa | PTTBroj | Mesto | Ulica | Broj
 1 | 11000 | Beograd | Palmoticeva | 2
 2 | 21000 | N.Sad | Dositejeva | 1

a pacijent Petar Petrovic zivi u Dositejevoj 1 u Novom Sadu onda je njegov rekord u tabeli Pacijent
Code:
 
 JMBG | imePrezime | IDAdresa
 1010970123456 | Petar Petrovic | 2

Znaci, ne treba da pravis kopiju adrese u tabeli pacijenata!

Na analogan nacin eliminisemo redundantne kolone iz table Obrasci.Tamo ostaju IDObrasca, datum i JMBG kao referenca na pacijenta. Obrazac nema adresu i nema potrebe za takvim poljima u tabeli Obrasci.

Ovde mozed da vidis database diagram za ove tri tabele.

Poz,
M.
[ spirit_vb @ 19.02.2012. 00:31 ] @
Slazem se sa tobom da bi resenje da sa tabelom Adresa umesto Mesto i Ulica bilo mnogo elegantnije,
rec je naime o projektu za fax, gde treba da se normalizovani model denormalizuje i posle urade trigeri,
moj normalizovani model nije imao ponavljanja atributa (4xPTTBroj i 3xnazivMesta i nazivUlice) tj. izgledao je ovako

Code:

Obrazac(IDObrasca, datum, JMBG)
Pacijent(JMBG, imePrezime, PTTBroj)
Mesto(PTTBroj, nazivMesta)
Ulica(redniBroj, PTTBroj, nazivUlice, brojUUlici)


pa zbog toga ne mogu sad da se vracam na to resenja, vec kapiram je poenta da prodjemo i vidimo kako to rade trigeri.
Sledeca stavka mi je kreiranje Korisnicki definisanih tipova, tako da mislim da ce mi ova adresa (mesto i ulica) biti neki struktuirani tip.

Hvala M u svakom slucaju a moracu da ostanem na svom resenju i odradim ovaj triger,
ali opet slazem se da je resenje sa Adresom verovatno bolje.
Ako mozes da mi pomognes sa kodom bio bih ti veoma zahavalan !

Pozz
[ HladankaoLed @ 19.02.2012. 10:05 ] @
OK, to je vec druga prica, mada je i tom slucaju i ovaj denormalizovani model pomalo nakaradan...
Anyway, evo trigera koji updatuje sve tri redundantne kolone u tabeli Pacijent.

Code:
ALTER TRIGGER dbo.TRG_PACIJENT
ON dbo.Pacijent
FOR UPDATE
AS
IF (UPDATE(PTTBroj) AND UPDATE (redniBroj))
BEGIN
      UPDATE p
      SET    p.nazivMesta = m.nazivMesta,
            p.nazivUlice = U.nazivUlice,
            p.brojUUlici = U.brojUUlici    
      FROM Pacijent p
      INNER JOIN inserted i
        ON p.JMBG = i.JMBG
      INNER JOIN mesto m
        ON i.PTTBroj=m.PTTBroj
      INNER JOIN Ulica u
        ON i.PTTBroj=u.PTTBroj;
END


Veoma je vazno da se napomene da ovaj triger radi samo kada su prilikom update obe referenc-kolone u tabeli Pacijent (PTTBroj i redniBroj) azurirane. Ako to nije intencija onda treba umesto jednog UPDATE statementa unutar trigera napisati dva, po jedan za svaku refernciranu tabelu.

HTH,
M.
[ spirit_vb @ 19.02.2012. 17:33 ] @
Super, hvala ti puno!
Da, da, naravno za UPDATE dve reference, sad vidim da mi je nelogicno da se moraju update-ovati istovremeno, moracu da ih razdvojim.
nekad si tako blizu a resenja i tako daleko

Hvala jos jednom
Pozdrav