PL / SQL'de Tetikleme nedir?
TETİKLEYİCİLER , tablo üzerinde ekleme, güncelleme, silme gibi DML İfadeleri yürütüldüğünde veya bazı olaylar meydana geldiğinde Oracle motoru tarafından otomatik olarak çalıştırılan depolanmış programlardır. Tetikleme durumunda çalıştırılacak kod ihtiyaca göre tanımlanabilir. Tetikleyicinin tetiklenmesi gereken olayı ve yürütme zamanlamasını seçebilirsiniz. Tetiklemenin amacı, veri tabanındaki bilgilerin bütünlüğünü korumaktır.
Bu eğitimde öğreneceksiniz-
- Tetikleyicilerin Yararları
- Oracle'da Tetikleyici Türleri
- Tetikleyici Nasıl Oluşturulur
- : YENİ ve: ESKİ Fıkra
- Tetik YERİNE
- Bileşik Tetikleyici
Tetikleyicilerin Yararları
Tetikleyicilerin faydaları aşağıdadır.
- Bazı türetilmiş sütun değerlerini otomatik olarak oluşturma
- Bilgi tutarlılığını zorunlu kılma
- Olay günlüğü ve tablo erişimi ile ilgili bilgilerin depolanması
- Denetleme
- Tabloların eşzamanlı çoğaltılması
- Güvenlik yetkilerinin dayatılması
- Geçersiz işlemlerin önlenmesi
Oracle'da Tetikleyici Türleri
Tetikleyiciler, aşağıdaki parametrelere göre sınıflandırılabilir.
- Zamanlamaya göre sınıflandırma
- Tetiklemeden ÖNCE: Belirtilen olay gerçekleşmeden önce ateşlenir.
- Tetiklemeden Sonra: Belirtilen olay meydana geldikten sonra ateşlenir.
- Tetik YERİNE: Özel bir tip. Diğer konular hakkında daha fazla bilgi edineceksiniz. (yalnızca DML için)
- Sınıflandırma dayalı seviyede
- STATEMENT level Trigger: Belirtilen olay ifadesi için bir kez tetiklenir.
- ROW seviyesi Tetikleyici: Belirtilen olaydan etkilenen her kayıt için ateşlenir. (yalnızca DML için)
- Etkinliğe Göre Sınıflandırma
- DML Tetikleyicisi: DML olayı belirtildiğinde tetiklenir (INSERT / UPDATE / DELETE)
- DDL Tetikleyici: DDL olayı belirtildiğinde ateşlenir (CREATE / ALTER)
- VERİTABANI Tetikleyicisi: Veritabanı olayı belirtildiğinde tetiklenir (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Dolayısıyla, her tetikleyici yukarıdaki parametrelerin birleşimidir.
Tetikleyici Nasıl Oluşturulur
Aşağıda bir tetikleyici oluşturmak için söz dizimi verilmiştir.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, tetik oluşturmada mevcut olan farklı isteğe bağlı ifadeleri gösterir.
- ÖNCE / SONRA olay zamanlamalarını belirleyecektir.
- INSERT / UPDATE / LOGON / CREATE / vb. tetikleyicinin tetiklenmesi gereken olayı belirtir.
- ON cümlesi, yukarıda bahsedilen olayın hangi nesne üzerinde geçerli olduğunu belirleyecektir. Örneğin bu, DML Tetiklemesi durumunda DML olayının meydana gelebileceği tablo adı olacaktır.
- "HER SATIR İÇİN" komutu, SATIR seviyesi tetikleyicisini belirleyecektir.
- WHEN cümlesi, tetikleyicinin devreye girmesi gereken ek koşulu belirtir.
- Bildirim bölümü, yürütme bölümü, istisna işleme bölümü diğer PL / SQL blokları ile aynıdır. Bildirim bölümü ve istisna işleme bölümü isteğe bağlıdır.
: YENİ ve: ESKİ Fıkra
Bir satır seviyesi tetikleyicide, tetikleyici her ilgili satır için etkinleşir. Ve bazen DML ifadesinden önceki ve sonraki değeri bilmek gerekir.
Oracle, KAYIT düzeyinde tetikleyicide bu değerleri tutmak için iki madde sağlamıştır. Tetikleyici gövdenin içindeki eski ve yeni değerlere atıfta bulunmak için bu maddeleri kullanabiliriz.
- : YENİ - Tetikleyici yürütme sırasında temel tablonun / görünümün sütunları için yeni bir değer tutar
- : ESKİ - Tetikleyici yürütme sırasında temel tablonun / görünümün sütunlarının eski değerini tutar
Bu madde, DML olayına göre kullanılmalıdır. Aşağıdaki tablo, hangi maddenin hangi DML ifadesi için geçerli olduğunu belirtecektir (INSERT / UPDATE / DELETE).
EKLE | GÜNCELLEME | SİL | |
:YENİ | GEÇERLİ | GEÇERLİ | GEÇERSİZ. Silme durumunda yeni değer yoktur. |
:ESKİ | GEÇERSİZ. Ekleme durumunda eski değer yok | GEÇERLİ | GEÇERLİ |
Tetik YERİNE
"INSTEAD OF trigger" özel tetik türüdür. Yalnızca DML tetikleyicilerinde kullanılır. Karmaşık görünümde herhangi bir DML olayı meydana geldiğinde kullanılır.
Bir görünümün 3 temel tablodan yapıldığı bir örnek düşünün. Bu görünüm üzerinden herhangi bir DML olayı yayınlandığında, veriler 3 farklı tablodan alındığı için bu geçersiz olacaktır. Yani bu INSTEAD OF tetikleyicisinde kullanılır. INSTEAD OF tetikleyicisi, verilen olay için görünümü değiştirmek yerine temel tabloları doğrudan değiştirmek için kullanılır.
Örnek 1 : Bu örnekte, iki temel tablodan karmaşık bir görünüm oluşturacağız.
- Table_1 emp tablosu ve
- Tablo_2, departman tablosudur.
Ardından, INSTEAD OF tetikleyicisinin bu karmaşık görünümdeki konum ayrıntı ifadesini UPDATE yayınlamak için nasıl kullanıldığını göreceğiz. Ayrıca: YENİ ve: ESKİ'nin tetikleyicilerde nasıl yararlı olduğunu göreceğiz.
- Adım 1: Uygun sütunlarla 'emp' ve 'dept' tablolarını oluşturma
- Adım 2: Tabloyu örnek değerlerle doldurma
- 3. Adım: Yukarıda oluşturulan tablo için görünüm oluşturma
- 4. Adım: Tetikleyiciden önce görünümün güncellenmesi
- Adım 5: Tetikleyici yerine tetikleyicinin oluşturulması
- 6. Adım: Tetikleyici yerine sonra görünümün güncellenmesi
Adım 1) Uygun sütunlarla 'emp' ve 'dept' tablosu oluşturma
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept(Dept_no NUMBER,Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
Kod Açıklama
- Kod satırı 1-7 : Tablo 'emp' oluşturma.
- Kod satırı 8-12 : Tablo 'bölüm' oluşturma.
Çıktı
Tablo Oluşturuldu
Adım 2) Şimdi tabloyu oluşturduğumuz için, bu tabloyu örnek değerler ve yukarıdaki tablolar için Görünümlerin Oluşturulması ile dolduracağız.
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN');COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10);COMMIT;END;/
Kod Açıklama
- Kod satırı 13-19 : 'Dept' tablosuna veri ekleme.
- Kod satırı 20-26: 'emp' tablosuna veri ekleme.
Çıktı
PL / SQL prosedürü tamamlandı
Adım 3) Yukarıda oluşturulan tablo için bir görünüm oluşturmak.
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
Kod Açıklama
- Kod satırı 27-32: 'guru99_emp_view' görünümünün oluşturulması.
- Kod satırı 33: guru99_emp_view sorgulanıyor.
Çıktı
Oluşturulanları görüntüle
İŞÇİ ADI | DEPT_NAME | YER |
ZZZ | İK | Amerika Birleşik Devletleri |
YYY | SATIŞ | İngiltere |
XXX | PARASAL | JAPONYA |
Adım 4) Tetikleme yerine önce görünümün güncellenmesi.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Kod Açıklama
- Kod satırı 34-38: "XXX" konumunu "FRANSA" olarak güncelleyin. Karmaşık görünümde DML ifadelerine izin verilmediğinden istisnayı gündeme getirdi.
Çıktı
ORA-01779: anahtarı korunmayan bir tabloyla eşleşen bir sütun değiştirilemez
ORA-06512: 2. satırda
Adım 5) Önceki adımda güncelleme görünümü sırasında hatayla karşılaşmamak için, bu adımda "tetikleyici" yerine "tetikleyici" kullanacağız.
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Kod Açıklama
- Kod satırı 39: SATIR düzeyinde "guru99_emp_view" görünümünde "GÜNCELLEME" olayı için INSTEAD OF tetikleyicisinin oluşturulması. Temel tablodaki 'dept' konumunu güncellemek için güncelleme ifadesini içerir.
- Kod satırı 44: Güncelleme ifadesi, güncellemeden önceki ve sonraki sütunların değerini bulmak için ': NEW' ve ': OLD' kullanır.
Çıktı
Tetikleyici Oluşturuldu
Adım 6) Tetikleme yerine sonra görünümün güncellenmesi. Artık "tetikleyici yerine" bu karmaşık görünümün güncelleme işlemini gerçekleştireceği için hata gelmeyecektir. Kod yürütüldüğünde, XXX çalışanının konumu "Japonya" dan "Fransa" olarak güncellenecektir.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Kod Açıklaması:
- Kod satırı 49-53: "XXX" konumunun "FRANSA" olarak güncellenmesi. Başarılı, çünkü 'INSTEAD OF' tetikleyicisi görünümdeki gerçek güncelleme ifadesini durdurdu ve temel tablo güncellemesini gerçekleştirdi.
- Kod satırı 55: Güncellenen kaydı doğrulama.
Çıktı:
PL / SQL prosedürü başarıyla tamamlandı
İŞÇİ ADI | DEPT_NAME | YER |
ZZZ | İK | Amerika Birleşik Devletleri |
YYY | SATIŞ | İngiltere |
XXX | PARASAL | FRANSA |
Bileşik Tetikleyici
Bileşik tetik, tek tetik gövdesindeki dört zamanlama noktasının her biri için eylemler belirlemenizi sağlayan bir tetikleyicidir. Desteklediği dört farklı zamanlama noktası aşağıdaki gibidir.
- BİLDİRİMDEN ÖNCE - seviye
- SATIRDAN ÖNCE - seviye
- SATIR SONRASI - seviye
- AFTER STATEMENT - seviye
Tesisin farklı zamanlama için eylemleri aynı tetikleyicide birleştirmesini sağlar.
CREATE [ OR REPLACE ] TRIGGERFOR[INSERT | UPDATE | DELET… .]ON BEFORE STATEMENT ISBEGIN ;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN ;END EACH ROW;AFTER EACH ROW ISBEGIN ;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN ;END AFTER STATEMENT;END;
Sözdizimi Açıklaması:
- Yukarıdaki sözdizimi, "BİLEŞİK" tetikleyicinin oluşturulmasını gösterir.
- Bildirim bölümü, tetik gövdesindeki tüm yürütme bloğu için ortaktır.
- Bu 4 zamanlama bloğu herhangi bir sırada olabilir. Bu 4 zamanlama bloğunun hepsine sahip olmak zorunlu değildir. Yalnızca gerekli zamanlamalar için BİLEŞİK tetikleyici oluşturabiliriz.
Örnek 1 : Bu örnekte, maaş sütununu varsayılan değer olan 5000 ile otomatik olarak doldurmak için bir tetikleyici oluşturacağız.
CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30);COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
Kod Açıklaması:
- Kod satırı 2-10 : Bileşik tetikleyicinin oluşturulması. Maaşın varsayılan değer olan 5000 ile doldurulması için SIRADAN ÖNCE zamanlama için oluşturulmuştur. Bu, kaydı tabloya eklemeden önce maaşı varsayılan değer olan "5000" olarak değiştirecektir.
- Kod satırı 11-14 : Kaydı 'emp' tablosuna ekleyin.
- Kod satırı 16 : Eklenen kaydı doğrulama.
Çıktı:
Tetik oluşturuldu
PL / SQL prosedürü başarıyla tamamlandı.
EMP_NAME | EMP_NO | MAAŞ | YÖNETİCİ | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Tetikleyicileri Etkinleştirme ve Devre Dışı Bırakma
Tetikleyiciler etkinleştirilebilir veya devre dışı bırakılabilir. Tetikleyiciyi etkinleştirmek veya devre dışı bırakmak için, onu devre dışı bırakan veya etkinleştiren tetikleyici için bir ALTER (DDL) ifadesi verilmesi gerekir.
Tetikleyicileri etkinleştirmek / devre dışı bırakmak için sözdizimi aşağıdadır.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Sözdizimi Açıklaması:
- İlk sözdizimi, tek tetikleyicinin nasıl etkinleştirileceğini / devre dışı bırakılacağını gösterir.
- İkinci ifade, belirli bir tablodaki tüm tetikleyicilerin nasıl etkinleştirileceğini / devre dışı bırakılacağını gösterir.
Özet
Bu bölümde, PL / SQL tetikleyicileri ve avantajları hakkında bilgi sahibi olduk. Ayrıca farklı sınıflandırmaları öğrendik ve INSTEAD OF trigger ve COMPOUND tetikleyicisini tartıştık.