Merhaba, bu yazıda Trigger konusuna bakacağız bir önceki yazıda fonksiyonları incelemiştik bu yazıya geçmeden önce incelemenizi tavsiye ederiz. https://ittutorial.org/pl-sql-programlama-10/
Trigger’ın türkçe karşılığı tetikleyci demektir veritabanında bir insert, update vb gibi bir işlem gerçekleştiğininde bunu algılayıp istediğimiz birşey gerçekleştirmeyi otomatize eder.
Trigger’ları şu işlemlerde kullanabiliriz;
- INSERT-UPDATE-DELETE
- ALTER-CREATE-DROP
- LOGON-LOGOFF-STARTUP-SHUTDOWN
Trigger Oluşturma:
Bütün oluşturma işlemlerinde olduğu gibi trigger oluştururken de CREATE anahtar kelimesini kullanırız
CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF } {INSERT [OR] | UPDATE [OR] | DELETE} [OF colum_name] ON table_name [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] WHEN() DECLARE ............... BEGIN ............. EXCEPTION .................. END;
BEFORE | AFTER | INSTEAD OF KULLANIMI:
Trigger’ın hangi işlemler önce,sonra veya yerine çalışacağını belirtebileceğimiz opsiyonar da mevcuttur
- BEFORE
- AFTER
- INSTEAD OF
BEFORE:
Herhangi bir tablo içerisinde değişiklil yapacağımız PL/SQL kodu çalışmadan önce BEFORE Trigger’ları çalışır ve burada bizim verdiğimiz kontrolleri yapar
Örnek olarak salı günü tabloya kayır girmeyi engelleyen bir trigger yazalım
CREATE OR REPLACE TRIGGER islem_kontrol BEFORE INSERT ON calisanlar BEGIN IF (to_char(sysdate,'DY') in ('TUE')) then raise_application_error(-20500,'Bu tabloya salı günü kayı girilemez!'); END IF; END; / insert into calisanlar values('Kemal',27,20000);
Görüldüğü gibi trigger sağlıklı bir şekilde çalışmış.
AFTER:
BEFORE işleminin yaptığı kontrolleri PL/SQL kod bitiminde yaparak işlemleri devam ettirir.
Örnek olarak Employees tablosunda yapılan değişikliği log tablosuna kayıt edelim.
CREATE OR REPLACE TRIGGER maas_kontrol AFTER UPDATE ON HR.EMPLOYEES BEGIN INSERT INTO log_emp values('Calisanın maası değişti',sysdate); END; / update HR.employees SET salary=salary+1000 where employee_id=102; select * from log_emp;
Yeni bir Trigger oluşturalım ve Employees tablosundaki değişiklikleri ekrana basalım.
CREATE OR REPLACE TRIGGER bolum_takip BEFORE DELETE OR INSERT OR UPDATE ON HR.EMPLOYEES FOR EACH ROW WHEN(NEW.employee_id>0) DECLARE ebolum varchar2(20); ybolum varchar2(20); BEGIN INSERT INTO log_emp(islem,tarih) values('Bölüm Değişti', SYSDATE); DBMS_OUTPUT.PUT_LINE('Eski bölüm' || :NEW.department_id); DBMS_OUTPUT.PUT_LINE('Yeni bölüm' || :OLD.department_id); END; /
update HR.EMPLOYEES set department_id=120 where employee_id=200;
Birkaç farklı kod bloğu var hemen onlara göz atalım
FOR EACH ROW:
Çalışankodun tablo üzerinde değişiklik yaptığı her satır için anlamındadır.
WHEN:
PL/SQLkodu içerisinde koşul belirttiğimiz alandır. FOR EACH ROW kullandığımızda ROW kullanırız.
OLD-NEW:
Kodun değiştirdiği verilerin referans noktalarıdı. Değişiklk önceki hali ve sonraki halini bunları sorgulayarak görüntüleyebiliriz.
Bu yazının da sonuna geldik bir sonraki yazıda Trigger’larda kaldığımız yerden devam edeceğiz,
Görüşmek üzere..