06.05. Okidači (TRIGGER) – koncept, vrste, kreiranje i odbacivanje
Koristimo bazu: A13_DVD (ako je imate na MS SQL Serveru, prvo obrišite staru bazu, pa postavite verziju: Kreirej_popuni_bazu_DVD_kolekcija)
Uvod
U radu sa bazama podataka često je potrebno da se određene akcije izvrše automatski kada dođe do promene podataka. Na primer:
- kada se doda novi zapis
- kada se izmeni postojeći zapis
- kada se obriše podatak
Postavlja se pitanje: Da li možemo naterati bazu da sama reaguje na ove promene?
Odgovor je: da, pomoću okidača (TRIGGER-a).
Okidači predstavljaju važan mehanizam koji omogućava automatsko izvršavanje SQL koda kao reakciju na određeni događaj u bazi.
1. Šta je okidač (TRIGGER)?
Okidač (TRIGGER) je posebna vrsta SQL objekta koji se automatski izvršava kada se desi određena promena nad tabelom.
Te promene su:
- INSERT (unos podataka)
- UPDATE (izmena podataka)
- DELETE (brisanje podataka)
Drugim rečima, okidač možemo zamisliti kao „automatizovanu reakciju baze na promenu podataka“
2. Kada se koriste okidači?
Okidači se koriste kada želimo:
- da pratimo promene (logovanje)
- da proverimo validnost podataka
- da automatski ažuriramo druge tabele
- da sprečimo neispravne izmene
Na primer: beleženje ko je i kada izvršio izmenu, zabrana brisanja važnih podataka ili automatsko ažuriranje statistike
3. Vrste okidača
U MS SQL Server-u postoje dve osnovne vrste:
AFTER okidači
Izvršavaju se nakon što se promena izvrši.
INSTEAD OF okidači
Izvršavaju se umesto osnovne operacije.
4. Posebne tabele: inserted i deleted
Okidači koriste dve specijalne tabele:
-
inserted → sadrži nove podatke
-
deleted → sadrži stare podatke
Na primer:
- kod INSERT → koristi se inserted
- kod DELETE → koristi se deleted
- kod UPDATE → koriste se obe
5. Kreiranje okidača
Sintaksa:
CREATE TRIGGER naziv_okidaca
ON naziv_tabele
AFTER INSERT/UPDATE/DELETE
AS
BEGIN
SQL naredbe
END;
6. Primeri (A13_DVD)
Primer 1: Logovanje unosa glumca
CREATE TABLE Log_Glumac (
Poruka VARCHAR(100)
);
CREATE TRIGGER trg_InsertGlumac
ON Glumac
AFTER INSERT
AS
BEGIN
INSERT INTO Log_Glumac
VALUES ('Dodat je novi glumac');
END;
Primer 2: Sprečavanje brisanja
CREATE TRIGGER trg_DeleteGlumac
ON Glumac
INSTEAD OF DELETE
AS
BEGIN
PRINT 'Brisanje nije dozvoljeno!';
END;
Primer 3: Reakcija na UPDATE
CREATE TRIGGER trg_UpdateFilm
ON Film
AFTER UPDATE
AS
BEGIN
PRINT 'Podaci o filmu su izmenjeni';
END;
7. Brisanje (odbacivanje) okidača
Sintaksa:
DROP TRIGGER naziv_okidaca;
Primer:
DROP TRIGGER trg_InsertGlumac;
Vežbe
Zadatak 1 - Kreirati okidač koji beleži unos novog filma.
Zadatak 2 - Kreirati okidač koji sprečava brisanje filmova.
Zadatak 3 - Kreirati okidač koji reaguje na promenu trajanja filma.
Zadatak 4 - Obrisati jedan okidač.
Dodatni zadaci za vežbu
Zadatak 5 - Napraviti okidač za tabelu Producent koji beleži INSERT.
Zadatak 6 - Napraviti okidač koji sprečava DELETE u tabeli Film.
Zadatak 7 - Napraviti okidač koji reaguje na UPDATE u tabeli Glumac.
Zadatak 8 - Objasniti razliku: AFTER vs INSTEAD OF okidač
Zadaci za rad kod kuće
Zadatak 9 - Napraviti log tabelu za izmene filmova.
Zadatak 10 - Napraviti okidač koji beleži svaku izmenu filma.
Zadatak 11 - Napraviti okidač koji sprečava unos filma bez naziva
Rešenje (primer)
CREATE TRIGGER trg_LogFilm
ON Film
AFTER INSERT
AS
BEGIN
PRINT 'Novi film je dodat';
END;
Zaključak
Okidači su alat koji omogućava da baza podataka automatski reaguje na promene. Oni omogućavaju dodatnu kontrolu i automatizaciju, ali zahtevaju pažljivo korišćenje.
Šta treba zapamtiti:
- okidači se izvršavaju automatski
- vezani su za događaje (INSERT, UPDATE, DELETE)
- mogu da kontrolišu i prate rad baze
...