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..
