PL/SQL Programlama — 8 — Triggers (Tetikleyiciler)
Triggers (Tetikleyiciler), PL/SQL içindeki son konumuz. Tetikleyiciler, yazıldıkları koşullara göre otomatik işlem yapan yapılardır. Örneğin bir tabloya veri ekleme, silme, güncelleme işlemleri için kayıt (log) tutulabilir. Tetikleyiciler aslında birer prosedürdür, prosedürlerden farkı Oracle tarafından çağırılmasıdır.
Tetikleyicilerin Harekete Geçtiği Durumlar
- DML ifadeleri: Insert, Update, Delete
- DDL ifadeleri: Create, Alter, Drop
- Veritabanı işlemlerinde. Örneğin, Logon, Logoff, Startup, Shutdown işlemleri.
Tetikleyicilerin Faydaları
- Sütunlar için otomatik değer üretmeleri.
- Uygun olmayan transaction’ları engellemek.
- Güvenlik katmanı oluşturmak.
- Loglama yapmak.
- Tablolara erişim bilgileri toplamak.
Tetikleyeci Oluşturma
Tetikleyici oluşturmak için CREATE TRİGGER deyimi kullanılır. Tetikleyici söz sizimi basitçe aşağıdaki gibidir:
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_name: Belirttiğimiz isimde yeniden oluşturur veya varolan tetikleyici ile değiştirir.
- {BEFORE | AFTER | INSTEAD OF}: Tetikleyicinin ne zaman tetikleneceğini belirleriz. Önce mi, sonra mı veya yerine mi.
- {INSERT [OR] | UPDATE [OR] | DELETE}: Hangi DML işlemi için tetikleyici olması gerektiğini belirtiriz.
- [OF col_name]: Hangi sütun için tetikleyici olması gerektiğini belirtiriz.
- [ON table_name]: Hangi tablo için tetikleyici olması gerektiğini belirtiriz.
- [REFERENCING OLD AS o NEW AS n]: DML sorgularındaki eski ve yeni değerleri verir.
- [FOR EACH ROW]: Etkilenen her satır için çalışmasını sağlar.
- WHEN (condition): FOR EACH ROW kullandığımızda kullanabiliriz. Etkilenen satırları kısıtlamak için kullanabiliriz.
Şimdi, verdiğimiz söz dizimini kullanarak bir tetikleyici yazalım:
CREATE OR REPLACE TRIGGER maas_degisikligini_goruntule
BEFORE DELETE OR INSERT OR UPDATE ON employees
FOR EACH ROW
WHEN (NEW.Employee_id > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Eski Maaş: ' || :OLD.salary);
dbms_output.put_line('Yeni Maaş: ' || :NEW.salary);
dbms_output.put_line('Maaş Farkı: ' || sal_diff);
END;
/
Bu tetikleyici ile employees tablosundaki bir maaş miktarına zam yapıldığında eski maaş ve yeni maaş tutarlarını ve arasındaki farkı ekrana yazdırabileceğiz. Şimdi tetikleyinin kontrol etmek için bir güncelleme işlemi yapalım ve sonucu görelim:
UPDATE Employees
SET salary = salary + 1500
WHERE Employee_Id = 101;
Employees tablosunda id’si 101 olan kişinin maaşına 1500 zam yapıyoruz. Ardından tetikleyici devreye giriyor:
Eski Maaş: 18500
Yeni Maaş: 20000
Maaş Farkı: 1500yazmış olduğumuz tetikleyici doğru biçimde çalışıyor. Bu yazmış olduğumuz tetikleyici DML ifade içeren bir tetikleyiciydi.Tetikleyiciyi Aktif - Pasif Duruma GetirmeBir tetikleyiciyi devre dışı bırakmak istersek ALTER TRIGGER deyimini kullanırız. Bu deyim ile ilgili söz dizimi:ALTER TRIGGER maas_degisikligini_goruntule DISABLE;Tetikleyici tekrar devreye almak istersek:ALTER TRIGGER maas_degisikligini_goruntule ENABLE;komutunu kullanırız.
Tetikleyicileri Görüntülemek
Veritabanındaki tetikleyicileri listelemek için aşağıdaki sorguyu kullanabiliriz:SELECT *
FROM user_triggers;
Tetikleyici Silmek
Bir tetikleyici ile işimiz bittiyse veya kullanmak istemiyorsak, işimize yaramayacaksa, silmek için aşağıdaki komutu kullanırız:DROP TRIGGER maas_degisikligini_goruntule;Özetle tetikleyiciler bu şekilde. PL/SQL programları yazmak istiyorsanız bu 8 yazıyı yutmanız gerekir. Ayrıca biraz pratik yaptıktan sonra sizi tutabilene aşk olsun. :)