СКЛ окидачи: Основни водич

Razumevanje SQL Triggera: Detaljan Vodič

U kontekstu SQL Servera, triggeri su specijalizovani entiteti baze podataka. Tehnički gledano, oni predstavljaju poseban tip funkcija koje se aktiviraju kao odgovor na određene operacije unutar baze podataka.

Ovaj osnovni vodič pružiće vam sveobuhvatne informacije o SQL triggerima, alatima koji mogu biti od velike koristi u vašem profesionalnom radu. Započnimo!

Šta su SQL triggeri?

Termin „trigger“ označava naredbu koja automatski izvršava upit svaki put kada dođe do promene sadržaja u bazi podataka.

Trigger je skup posebno imenovanih SQL upita koji se čuvaju u memoriji. To je specifičan tip poziva funkcije koji se pokreće automatski kad god se dogodi neki događaj u bazi podataka. Svaki trigger je povezan sa određenom tabelom.

Na primer, trigger se može aktivirati svaki put kada se u određenu tabelu doda nova kolona ili ako se neki zapisi menjaju.

Prema Microsoft Developer Network-u, triggeri su specijalna klasa uskladištenih procedura. U definiciji triggera, prvo određujemo kada se trigger treba pokrenuti, a zatim definišemo radnju koju treba izvršiti nakon aktiviranja triggera.

Sintaksa:

CREATE TRIGGER naziv_triggera
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON naziv_tabele
FOR EACH ROW SET operacija [telo_triggera];

Objašnjenje svakog parametra:

  • CREATE TRIGGER naziv_triggera – Koristi se za kreiranje novog triggera ili izmenu postojećeg.
  • BEFORE/AFTER – Ovaj upit definiše vreme izvršenja triggera (pre ili posle određenog događaja).
  • INSERT/UPDATE/DELETE – Ovo opisuje akciju koju želimo da izvršimo nad tabelama.
  • ON naziv_tabele – Ovde definišemo ime tabele za koju se trigger postavlja.
  • FOR EACH ROW – Ova naredba se odnosi na trigger reda, što znači da će se trigger izvršavati svaki put kada se red menja.
  • telo_triggera – Određuje radnju koju treba izvršiti kada se trigger aktivira.

Triggeri su uskladištene funkcije sa jedinstvenim identifikatorima, što nam omogućava da ponovo koristimo već izvršene upite koji su bezbedno sačuvani u memoriji. Sada, hajde da shvatimo zašto su SQL triggeri potrebni.

Triggeri se prvenstveno koriste za regulisanje izvršavanja koda u slučaju događaja. Drugim rečima, korišćenje triggera je idealno ako je potrebno da se određeni kod stalno pokreće kao odgovor na neki događaj.

U nastavku su navedene neke od prednosti korišćenja triggera u operacijama SQL baze podataka:

  • Vrši dodatne provere prilikom umetanja, ažuriranja ili brisanja podataka iz tabele na koju se odnosi.
  • Smanjuje vreme odziva, što doprinosi smanjenju računarskih troškova.
  • Omogućava kodiranje kompleksnih podrazumevanih parametara koji nisu dostupni kroz standardna ograničenja.

Referentni integritet je ključna osobina sistema relacionih baza podataka. To znači da podaci koji se čuvaju u bazi podataka moraju biti tačni u svakoj transakciji i operaciji.

Ako se dve tabele nalaze u odvojenim bazama podataka ili sistemima, ne postoji način da se osigura validacija podataka pomoću ograničenja. U takvim situacijama, triggeri su jedini način za implementaciju takve validacije.

Kombinacija argumenata triggera

Za svaku tabelu, možemo definisati šest različitih tipova triggera. Ovo je kombinacija argumenata triggera koji se primenjuju na nivou reda.

  • BEFORE INSERT: Ovi triggeri izvršavaju akciju pre izvršavanja bilo koje INSERT operacije u datoj tabeli ili bazi podataka.
  • AFTER INSERT: Izvršava akciju nad redovima neposredno nakon bilo koje INSERT operacije.
  • BEFORE UPDATE: Sa ovim triggerima, funkcija se izvršava pre izvršavanja UPDATE akcije nad bazom podataka.
  • AFTER UPDATE: Izvršava akciju nad redovima odmah nakon bilo koje UPDATE operacije nad bazom podataka.
  • BEFORE DELETE: Izvršava operaciju nad redovima čak i pre nego što se izvrši DELETE akcija.
  • AFTER DELETE: Ovi triggeri izvršavaju radnju nad redovima nakon svake DELETE transakcije.

Tipovi SQL triggera

SQL triggeri su uskladištene funkcije koje se automatski pokreću kada se dogode određeni događaji. To je slično planiranju vođenom događajima. Sledeće situacije mogu aktivirati izvršavanje triggera:

  • DML triggeri: DML je skraćenica od „Data Manipulation Language“. Izvršavanje koda kao odgovor na modifikaciju podataka omogućeno je DML triggerima. Ovi triggeri se aktiviraju kada se izvrše DML komande kao što su INSERT, UPDATE i DELETE. Takođe su poznati i kao „triggeri na nivou tabele“.
  • DDL triggeri: DDL je skraćenica od „Data Definition Language“. DDL triggeri nam omogućavaju da pokrenemo kod kao odgovor na promene šeme baze podataka, kao što je dodavanje ili brisanje tabela, ili događaje na serveru, kao što je kada se korisnik prijavi. Zovu se i „triggeri na nivou baze podataka“. Ovi triggeri se aktiviraju kada se izvrše određene DDL naredbe kao što su CREATE, ALTER ili DROP. Mogu se koristiti i za praćenje i upravljanje aktivnostima.
  • LOGON triggeri: Kad god se dogodi bilo koji LOGON događaj (pokretanje, prijavljivanje, odjava, isključivanje), LOGON triggeri se odmah pozivaju. Izvršavaju se tek nakon procesa autorizacije korisnika i pre nego što se započne korisnička transakcija. LOGON triggeri se neće pokrenuti ako autorizacija ne uspe. Ovi triggeri se mogu koristiti za evidentiranje istorije prijavljivanja ili uspostavljanje ograničenja, kao i za reviziju i upravljanje identitetima za veze sa serverom.
  • CLR triggeri: CLR je skraćenica od „Common Language Runtime“. CLR triggeri su poseban podskup triggera koji su primarno izgrađeni na CLR-u u okviru .NET tehnologije. Ovi triggeri su korisni ako trigger treba da izvrši mnogo proračuna ili da se odnosi na entitet koji nije SQL. DML i DDL triggeri se mogu konstruisati omogućavanjem kodiranja CLR triggera u .NET tehnologijama kao što su Visual Basic, C# i F#.

Primer SQL Server Triggera

Razumimo ove koncepte triggera na praktičnom primeru.

Prvo, kreirajmo bazu podataka koristeći SQL izraze:

CREATE DATABASE testdb;
use testdb;

Ovde sam nazvao bazu podataka „testdb“. Sledeći korak je kreiranje tabele:

CREATE TABLE student(
    name varchar(25),
    id int(2),
    maths int(2),
    physics int(2),
    biology int(2),
    social int(2),
    total int(2)
  );

Kreirao sam tabelu za čuvanje podataka o učenicima. Ispod je naredba za opisivanje strukture tabele. „student“ je ime tabele:

DESC student;

Struktura tabele koju sam kreirao:

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(25) | YES  |     | NULL    |       |
| id      | int         | YES  |     | NULL    |       |
| maths   | int         | YES  |     | NULL    |       |
| physics | int         | YES  |     | NULL    |       |
| biology | int         | YES  |     | NULL    |       |
| social  | int         | YES  |     | NULL    |       |
| total   | int         | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
    

Nakon kreiranja tabele, sledeći korak je postavljanje triggera. Pokušajmo da koristimo argument BEFORE INSERT.

Naziv triggera koji sam kreirao je „marks“. Čim se tabela izmeni ocenama učenika, trigger će automatski izračunati ukupnu ocenu učenika:

CREATE TRIGGER marks
BEFORE INSERT
ON
student
FOR EACH ROW
set new.total=new.maths+new.physics+new.biology+new.social;

Pošto se od nas traži da zamenimo podatke redova umesto da radimo sa starim, definisali smo „total“ koristeći novo ime klase, a svi naredni izrazi imaju prefiks sa new nakon total koristeći operator tačka. Sada ćemo dodati vrednosti svakom redu i videti rezultate. Na početku, ukupna ocena je 0 za svakog učenika:

INSERT INTO student VALUES("George",02,99,87,92,91,0);
INSERT INTO student VALUES("James",03,91,81,94,90,0);
INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
INSERT INTO student VALUES("John",05,73,89,78,92,0);
INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);

Izjava triggera će se automatski pokrenuti kada se podaci ubace u tabelu učenika. Ukupan broj poena svakog učenika će biti izračunat pomoću triggera. Hajde da vidimo da li je trigger pozvan ili ne koristeći SELECT naredbu:

SELECT * FROM table_name;

I evo konačnog rezultata:

mysql> select * from student;
+--------+------+-------+---------+---------+--------+-------+
| name   | id   | maths | physics | biology | social | total |
+--------+------+-------+---------+---------+--------+-------+
| George |    2 |    91 |      81 |      94 |     90 |   356 |
| James  |    3 |    86 |      70 |      73 |     88 |   317 |
| Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
| John   |    5 |    94 |      75 |      69 |     79 |   317 |
| Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
+--------+------+-------+---------+---------+--------+-------+
5 rows in set (0.00 sec)

U gornjem rezultatu se vidi da su sve ocene predmeta automatski dodate za svakog učenika. Dakle, možemo zaključiti da je trigger uspešno pozvan.

Dodatne operacije triggera

Možemo izvršiti mnoge operacije pomoću triggera. Neke mogu biti jednostavne, a neke složenije, ali kada se prođu kroz upite, lako ih je razumeti. Korišćenjem Transact-SQL naredbi, možete omogućiti, onemogućiti ili izbrisati triggere koristeći sledeće komande:

Upit za proveru da li postoji određeni trigger

Ova komanda proverava da li postoji navedeni trigger u celoj bazi podataka:

SELECT * FROM [sys].[triggers] WHERE [name] = 'Naziv_Triggera'

Upit za prikaz triggera

Svi triggeri koji su dostupni u aktivnoj bazi podataka biće prikazani sledećom naredbom:

SHOW TRIGGERS;

Upit za onemogućavanje triggera

Sledeća komanda deaktivira trigger u bazi podataka:

DISABLE TRIGGER naziv_triggera ON DATABASE;

Takođe, možete navesti određeno ime tabele da biste onemogućili trigger:

DISABLE TRIGGER naziv_triggera ON naziv_tabele;

Upit za omogućavanje triggera

Sledeća naredba prvo deaktivira određeni trigger koji je definisan na navedenoj tabeli u aktivnoj bazi podataka, pre nego što ga ponovo omogući:

ALTER TABLE naziv_tabele DISABLE TRIGGER naziv_triggera

ALTER TABLE naziv_tabele ENABLE TRIGGER naziv_triggera

Trigger mora biti onemogućen pre nego što ga pokušate omogućiti.

Upit za omogućavanje ili onemogućavanje svih triggera u tabeli

Koristeći gornju SQL naredbu, možemo deaktivirati ili aktivirati sve triggere tabele u isto vreme tako što ćemo zameniti „ALL“ umesto određenog naziva triggera:

ALTER TABLE naziv_tabele DISABLE TRIGGER ALL

ALTER TABLE naziv_tabele ENABLE TRIGGER ALL

Upit za brisanje triggera

Trigger se može izbrisati brisanjem njega samog ili cele tabele. Svaki povezani trigger se takođe briše kada se obriše tabela:

DROP TRIGGER [naziv_triggera];

Kad god se trigger izbriše, povezani podaci se uklanjaju iz tabele podataka sys.objects.

Prednosti triggera

  • Jednostavno je kreirati triggere, a sam trigger može pozvati sačuvane funkcije i metode.
  • Korisnici mogu implementirati jednostavnu reviziju pomoću triggera.
  • Ne možete kreirati ograničenja između entiteta u sistemima baza podataka sa SQL Serverom, iako možete emulirati rad ograničenja koristeći triggere.
  • Ograničenja integriteta mogu se primeniti u bazama podataka pomoću triggera.
  • Kada je potrebna grupna validacija, a ne verifikacija red po red novo unetih ili promenjenih podataka, triggeri mogu biti od pomoći.

Nedostaci triggera

SQL triggeri možda nisu najbolji izbor u nekim situacijama zbog svojih ograničenja:

  • Triggeri moraju biti tačno dokumentovani.
  • Zbog istovremenog izvršavanja baze podataka koje možda nije dostupno komponentama aplikacije, otklanjanje grešaka u triggerima može biti izazovno.
  • DML iskazi postaju složeniji kada se koriste triggeri.
  • Čak i manji problem sa triggerom može dovesti do logičkih grešaka u iskazu.

Zaključak

Triggeri su vrlo korisne komponente Transact-SQL-a i SQL-a, a možete ih koristiti i u Oracle-u. Upotreba triggera je ključna prilikom pozivanja uskladištenih metoda. Ovi SQL triggeri nam omogućavaju da analiziramo vremenske okvire aktivnosti i odredimo kako da odgovorimo na njih ako je potrebno. Takođe, možemo proveriti da li je određena tabela povezana sa triggerom za prikupljanje podataka.

Rekurzija se može omogućiti triggerima. Kad god trigger na tabeli izvrši komandu na nadređenoj tabeli, druga iteracija triggera se pokreće i to je poznato kao rekurzivni trigger. Ovo pomaže dok pokušavate da rešite korelaciju identiteta.

Pored toga, triggeri regulišu obrazac ažuriranja koji je bazi podataka dozvoljeno da prihvati. Veoma je korisno zadržati ograničenja integriteta podataka u sistemu baze podataka ako SQL ključevi ograničenja ne postoje (uglavnom primarni ključ i strani ključ).

Nadam se da vam je ovaj članak bio od pomoći u učenju o SQL triggerima.

Ako želite detaljno da učite o bazama podataka, evo nekoliko odličnih resursa za učenje SQL-a i NoSQL-a.