Trigger’lar dml (data manupulation language) olarak tanımladığımız. insert, update ve delete ifadelerinden sonra çalıştırılır. Triggerlar tablolar üzerinde oluşturulur.  Sql veya PL / SQL ifadelerinden oluşurlar.

Trigger oluşturan sql ifadeleri

CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
   Declaration-statements
BEGIN
   Executable-statements
EXCEPTION
   Exception-handling-statements
END;


CREATE [OR REPLACE ] TRIGGER: /*Trigger verilen isimde oluşturlur veya değiştirilir.*/
BEFORE | AFTER | INSTEAD OF: /*Trigger’in ne zaman tetikleneceğini belirlenir.*/
BEFORE: /*Trigger içinde ki işlem tablo üzerinde ki işlemden önce gerçekleşir.*/
AFTER: /*Trigger içinde ki işlem tablo üzerinde ki işlemden sonra gerçekleşir.*/
INSTEAD OF: /*SQL ifadesi yerine Trigger'ın içerisindeki ifadeler çalıştırılır.*/
/*View üzerinde ki işlemlerde, view’ a ulaşmak yerine  içerisinde ki tablo oluşturulur.*/ 
INSERT [OR] | UPDATE [OR] | DELETE:  /*Seçilen DML işlemine göre trigger planlanır.*/
OF: /*Hangi sütunlar için trigger yapılacağı belirlenir.*/
ON: /*Hangi tablo için trigger yapılacağı belirlenir.*/
REFERENCING OLD AS o NEW AS n:  /*n DML sorgularındaki eski ve yeni değerleri verir.*/

Triggerlar procedurlerden farklı şekilde çalışırlar. Trigger oracle tarafından çalıştırılırken, procedure kullanıcı, application veya başka triggerlar tarafından çalıştırılır.

Trigger ile DML ifadeleri kısıtlanabilir. Tek bir trigger ile tabloya kullanıcıları girişi ve yetkisi engellenebilir.

Trigger ile;

  • Sütunlar için otomatik değer üretilir.
  • Loglama yapılabilir, güvenlik katmanı oluşturulabilir.
  • Tablo erişimi ile bilgi toplanır. Tablo eşitleme yapılabilir.
  • Uygun olmayan transactionlar engellenir.

Trigger’ların Kısımları:

 

Bir trigger’ın basitçe 3 tane kısmı vardır.

1-Trigger’ın hangi tablo üzerinde ne zaman çalışacağını gösteren kısım.

2-Trigger kısıtı – Ne zaman tetikleneceğini gösteren kısım.

3-Trigger aksiyonu – Bütün koşullar oluştuğunda trigger’ın hangi işlemleri yapacağını gösteren bölüm.

 

Trigger Örneği Çalışması

Trigger örneğine başlamadan önce ilk olarak üzerine trigger işlemi yaptırabileceğimiz içinde data bulunan bir tablo oluşturalım.

CREATE TABLE URUNLER 
(
URUN_NO INTEGER PRIMARY KEY,
URUN_ADI VARCHAR2 (20),
URUN_ADEDI FLOAT,
URUN_TURU VARCHAR2 (20),
URUN_GRS_TRH DATE
);
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('100','SU','200', 'SIVI', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('101','ÇİKOLATA','500', 'TATLI', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('102','EKMEK','100', 'UNLU MAMULLER', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('103','SALAM','120', 'ET', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('104','BEYAZ PEYNİR','50', 'SÜT', TO_DATE('24/08/2017','DD/MM/YYYY'));
INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('105','SÜT','2000', 'SÜT', TO_DATE('24/08/2017','DD/MM/YYYY'));
COMMIT;
SELECT * FROM URUNLER;

CREATE TABLE TEDARIK 
(
URUN_NO INTEGER PRIMARY KEY,
TEDARIKCI VARCHAR (50),
FOREIGN KEY (URUN_NO) REFERENCES URUNLER (URUN_NO)
); 
INSERT INTO TEDARIK (URUN_NO, TEDARIKCI) VALUES (100, 'SUCU'); COMMIT;  
SELECT * FROM TEDARIK;
  • Tabloya data eklenmesi ile ilgili koşulları gösteren trigger
  • Tablodan kayıt sildirmeyen trigger
    CREATE OR REPLACE TRIGGER TRIG_URUN
       BEFORE DELETE ON URUNLER
       FOR EACH ROW
    DECLARE
    BEGIN
       raise_application_error (-20000,'SILME_YOK : Bu tablodan kayit silemezsiniz...');
    END;
    DELETE FROM URUNLER
    WHERE URUN_NO = '100';
    

  • Tabloya data eklenmesi ile ilgili koşulları gösteren trigger
CREATE OR REPLACE TRIGGER RESTRICT_URUNLER  
BEFORE INSERT OR UPDATE OF URUN_ADEDI ON URUNLER  
FOR EACH ROW  
BEGIN  
IF  (:new.URUN_ADI IN ('SU'))  
AND :new.urun_adedi > 200 THEN  
 RAISE_APPLICATION_ERROR (-20202,  
'su 200 adetten fazla satın alınamaz');  
END IF;  END;

INSERT INTO URUNLER (URUN_NO, URUN_ADI, URUN_ADEDI, URUN_TURU, URUN_GRS_TRH) VALUES ('110','SU','201', 'SIVI', TO_DATE('25/08/2017','DD/MM/YYYY'));

Triggerlar konusunda ilerleyen dönemlerde ki çalışmaları yine bu sayfadan takip edebilirsiniz. 🙂