Nekada davno, baze podataka nisu znale da uspostave referencijalni integritet. Nije bilo Foreign Key i trebalo je nekako uspostaviti kontrolu nad podacima.
Trigeri su se koristili za stavri tipa 'ne moze da se unese red u tabelu Dete ako ne psotoji red u tabeli Roditelj'. Danas to radi FOREIGN KEY constraint. Takodje, radile su se stvari tipa 'kad obrisem red iz tabele Roditelj , hocu da se automatski obrisu svi odgovarajuci redovi u tabeli Dete'. Danas to takodje radi FOREIGN KEY, kad mu se doda 'ON DELETE CASCADE' ili 'ON UPDATE CASCADE'. Znaci, otpala je potreba da se pisu trigeri koji ce to da rade.
Teorija kaze da u dobro projektovanoj bazi (normalizacija), nema potrebe za trigerima. To je teorija. U praksi, baze cesto nisu potpuno normalizovane, bilo namerno ili nenamerno. Na primer, banka ima dve tabele Account i AccountTransactions. Po teoriji, balans (stanje) na racumu (Account) se ne cuva u bazi, nego se racuna kad zatreba. U praksi, desava se da je broj transakcija toliko veliki da izracunavanje balansa postaje sporo, ili bar tako ljudi veruju. Zbog toga neki vole da u tabeli Account imaju kolonu Balance koja se azurira kad god se unese red u AccountTransactions. U AccountTransactions se stavi triger koji radi UPDATE za tabelu Account. Isti triger nmoze da proveri da li nova transakcija nece mozda da anrusi pravilo d abalans ne sme da id u minus, ili da ide u minus previse ('dozvoljeni minus'). Deo ovoga moze da se postigne i bez trigera (kontrola balansa), a vodjenje stanja stalno je diskutabilan zahtev. Obicno se stanje vodi konstantno upravo da bi se proverilo pri svakoj transakciji da se mnmalni balans ne narusi. ako to vec mozemo da postignemo na drugi nacin, zasto bismo uopste i vodili stanje stalno?
Ovde imas ideju i primer kako se umesto trigera mogu upotrebiti CHECK CONSTRAINTS:
http://www.baze-podataka.net/2...-funkcija-u-check-constraints/
Zavisno od toga koliko ti je baza ne-normalizovana, namerno ili nenamerno, imaces vecu ili manju potrebu z atrigerima.
Ima situacija kad su trigeri zaista potrebni. Na primer, cuvanje istorije. Pre nego se desi promena (UPDATE, DELETE) u tabeli, redovi koji se menjaju/brisu salju se u tabelu Istorija. Na samoj tabeli IStorija ne zelimo nikakve promene, ni UPADTE ni DELETE. To nam omogucuje triger FOR UPADTE, DELETE na tabeli Istorija, koji ima smo jednu anredbu - ROLLBACK.
Drugi slucaj je 'zakljucavanje' redova u tabelama. Na primer, imas u tabeli redove iz vise godina. Onda zelis da se mogu menjati redovi samo iz tekuce godine, da sve prethodne godine budu 'zakljucane'. Onda moze da se napise triger koji ce da ROLLBACK sve promene za zakljucanim redovima.
Trece je popunjaanje kolona 'UserUpdated'. Na UPDATE se napise triger koji kolonu UserUpdated popuni sa recimo UseName()
Dalje od toga, nema neke potrebe za trigerima. Naravno, ako znate kako to drugacije moze da se uradi. Ko ne ume - mora da pise triger. Ko ima cekic, sve mu izgleda kao ekser.
Problem sa trigerima je sto su mnogo tezi za pisanje, i sporo se izvrsavaju. Naoko je lako napisati triger, ali nije. Opasno je verovati da se triger lako pise zato sto negde pise daje 'triger samo stred procedura koja se izvrsava na nivou tabele'. A mi smo programeri, umemo da pisemo kod => umemo d apisemo i stored procedure (zista

) pa sledi da umemo da pisemo i trigere. A brzina? Ma samo neka radi, za brzinu cemo da dodamo RAM i da optuzimo hardver. Tako mali Djokica zamislja stvari.
Eto recimo, triger koji si ti napisao u ima jednu opasnu manu - radi samo za jedan red. Ako se uradi neka operacija nad vise redova, tvoj trigre ce da krasira. Zasto? Ova linija
Code:
Declare @Sifra varchar(20)
select @Sifra = inserted.sifra from inserted
predpostavlja da je u tabeli inserted tacno jedan red. To je veoma nerealna pretpostavka. Zasto bi se procesirao jedan po jedan red? Kad bi umeo da napravis JOIN izmedju INSERTED i KNJIGE, mogao bi da procesiras i vise redova. Posto nije lako naterati i testirati triger, pametni ljudi to izbegavaju koliko god mogu. Vidis, SQL nije namenjen za proceduralno razmisljanje (jeden po jedan red), nego se akcije desavaju nad skupom redova. Tek tada SQL postaje mocno oruzje. Bez toga, SQL je samo obicno skladiste podataka, neefikasno uz to.
Zasto su trigeri ipak popularni? Zato sto danas malo ko zaista uci SQL. Ljudi uce programiranje, .NET, C##, objektna zavrzlama, Java itd, koje je jedan proceduralni proces. Onda programerske vestine pokusaju da prenesu u SQL. Otud trigeri, otud kursori. Ljudima se to cini poznato i lakse im je da napisu triger ili kursor, nego da uce SQL, koji ima potpuno drugaciju logiku od proceduranog programiranja. Nije retko da se u triger stavi kursor i redovi procesiraju jedan po jedan, u nekoj petlji. Absolutni horor. Zamislite brzinu izvrsavanja i probleme sa zakljucavanjem tabela i redova. SQL se koristi tamo gde se biti na stotine korisnika i bezbroj transakcija. Ako svaki korisnik podnese transakciju, a onda triger to sve mora da procesira jedno po jedno, ode mast u propast, a korisnici cekaju li cekaju.
Dakle, glavni razlog za koriscenje trigera naveliko je nenzanje, koga ima dve vrste. Vrsta 1: naucio sam pre 20 godina da psiem trigere i to mogu brzo da uradim bez gresaka, pa zasto bih se mucio da naucim nesto drugo? Vrsta 2: ja i ne zanm SQL, ali znam da programiram, pa zasto to znanje ne bih iskoristio, nemam vremena da ucim SQL. Vrsta 1 je manje opasna, jer covek nesto zna, process na kraju karejva radi, samo je to znanje manje efikasno od neceg drugog. Vrsta 2 je mnogo cesca nazalost, i mnogo opasnija. Ne znas, a ne znas da ne znas.
Nadam se da je sada malo jasnije.