Sağlık ve Bilişimde Objektif Haber

  English

SQL UYGULAMALARI - 5

           Bu sayımızda veri tabanı tetikleyicilerinden (TRIGGER) bahsedeceğiz. Tetikleyiciler hazırlanırken dikkat edilmesi gereken temel hususlar da ve tetikleyiciler içinde kullanılan bazı kavramlardan bahsedeceğiz. Burada göreceğiniz örnek tetikleyicileri denemek için daha önceki SQL bilgilerimizi kullanarak Çözüm Hastane Otomasyon Yazılımlarımızdaki F9 sql işlemlerinden DENEME ve LOGDENEME tablolarını aşağıdaki sql komutları ile oluşturalım.

           CREATE TABLE DENEME (KEY NUMBER,AD VARCHAR2(15),SOYAD VARCHAR2(15),CINSIYET VARCHAR2(5))

           CREATE SEQUENCE DENEMESEQ MINVALUE 1 INCREMENT BY 1 NOCACHE NOCYCLE

           CREATE TABLE LOGDENEME (LOGKEY NUMBER,KEY NUMBER,AD VARCHAR2(15),SOYAD VARCHAR2(15),CINSIYET VARCHAR2(5),ZAMAN DATE,AÇIKLAMA VARCHAR2(50))

           CREATE SEQUENCE LOGDENEMESEQ MINVALUE 1 INCREMENT BY 1 NOCACHE NOCYCLE

           Tetikleyiciler bir tablo üzerinde yeni kayıt ekleme, silme , düzeltme gibi işlemler doğrultusunda yapılması istenilen işlemleri kontrol altına alınması için kullanılır.

           Tetikleyici hazırlamada dikkat edilmesi gereken husus tetikleyicilerin satır sayısını 60'ın üzerine geçmemesini sağlamaktır. Çünkü tetikleyiciler her çalıştığında Oracle Database tarafından tekrar derlenir. Bu tip satır sayısı fazla olan tetikleyicilerde yapılacak işlemleri Prosedür halinde oluşturup prosedürü tetikleyici içinde çağırmak sisteminizin performansını arttıracaktır. Çünkü prosedürler bir kez derlenir. Tetikleyiciler ise her çalıştırıldığında tekrarderlenir.

           Tetikleyicilerin oluşturulması:

           Create Trigger DenemeTrigger1

           Komutu ile oluşturulur. Burada eğer trigger önceden oluşturulmuş ise;

           Create or Replace Trigger DenemeTrigger1

           şeklinde de tetikleyici silmeden tekrar oluşturabilirsiniz. Tetikleyicilere isim verirken Tablo isimleri ile aynı ismi kullanabilirsiniz. Ama bunu ileride değişik karışıklıklara neden olacağı için tavsiye etmeyeceğiz.

           Tetikleyici ismini belirledikten sonra tetikleyicinin ne zaman çalışacağını belirlemeniz gerekmektedir. Bunun için iki ayrı seçenek vardır. Bunlar BEFORE (Önce), AFTER (Sonra) seçenekleridir. Bu seçenekler tetikleyici ismi yazıldıktan hemen sonra kullanılmalıdır.

           Create Trigger DenemeTrigger1

           After

           Tetikleyiciler Sql ifadelerinde 3 ayrı ifade sonucu çalıştırabilinir. Bunlar;

           1. Insert
2. Update
3. Delete

           Tetikleyiciler tablo alanlarının sadece bir tanesine göre çalıştırılacağı gibi tüm alanlar için de çalıştırılabilir. Sadece bazı kolanlar üzerinde yapılan işlem sonucu çalıştırılmak isteniyorsa seçilen ifadeden sonra OF anahtarı yazılarak kolon isimleri aralarına virgül konarak ON anahtarının yazıldığı bölüme kadar kullanılır.

           Create Trigger DenemeTrigger1 After Update Of AD,SOYAD On Deneme

           Yukarıdaki örnekteki tetikleyici, Deneme tablosunda, Ad ve Soyad alanında herhangi bir değişiklik yapıldığı durumda çalışacaktır.

           Not: Bir tetikleyici sadece tek bir tablo için kullanılabilir.

           Buraya kadar tetikleyicilerin isimlendirilmesi ve çalışma durumların belirlenmesinden bahsettik bununla ilgili bir kaç örnek sayesinde çalışma durumlarını açıklayarak daha anlaşılır hale getirelim.

           1.Create Trigger DenemeTrigger1 After Delete On Deneme

           Şeklinde tanımlanmaya başlandığı durumda bu tetikleyici Deneme tablosu üzerinde herhangi bir silme işlemi yapıldığı durumda çalışacaktır.

           2. Create Trigger DenemeTrigger1

           After Update Or Delete or Insert On Deneme

           Yukarıdaki tetikleyici ise Deneme tablosu üzerinde kayıt silme, güncelleme ve yeni kayıt işlemleri sonrasında çalışacaktır.

           3. Create Trigger DenemeTrigger1

           Before Delete On Deneme

           Bu tetikleyici ise Deneme tablosundan kayıt silme işlemi yapmadan önce çalışacaktır.

           Bundan sonra ki bölümde ise trigger tipini belirlememiz gerekmektedir. 2 tip trigger vardır. Bunlar;

           1.Satır Tetikleyicileri (ROW TRIGGERS)

           Bu tetikleyiciler trigger ifade tarafından etkilenen her satır için ayrı ayrı çalışır.

           2.İfade Tetikleyicileri (STATEMENT TRIGGERS)

           Burada ise tablo içinde etkilenen her satır için tek tek değil yalnız bir kez çalışır. Buradaki kullanım amacı genelde o anki zaman veya kullanıcı üzerine kompleks bir güvenlik kontrolü yapmak içindir.

           Örnek: Create Trigger DenemeTrigger1 Before Delete On Deneme For Each Row

           REFERENCING ifadesi tablo isimleri arasındaki isim karışıklığını kaldırmak için kullanılır. Ancak bu kullanım fazla tercih edilmez.

           Örneğin:

           Create Trigger DenemeTrigger1 Before Delete On Deneme Referencing Deneme As H For Each Row

           WHEN ifadesi satır tetikleyicilerde kullanılır. Tetikleyicinin sadece belirtilen şart oluştuğunda çalışmasını sağlar.

           CREATE OR REPLACE TRIGGER DenemeTrigger1

     AFTER UPDATE ON Deneme

     FOR EACH ROW

     WHEN (NEW.CINSIYET <> OLD.cinsiyet)

     BEGIN

INSERT INTO LOGDENEME

      (LOGKEY,KEY,AD,SOYAD,CINSIYET,ZAMAN,ACIKLAMA)

   VALUES            

(LOGDENEMESEQ.NEXTVAL, :OLD.KEY, :OLD.AD, :OLD.SOYAD, :OLD.CINSIYET, SYSDATE, 'CİNSİYET DEĞİŞTİRİLDİ.);

END;

           Burada DENEME tablosunda yapılan güncelleme sonucu CINSIYET kolonunun değeri değişmiş ise LOGDENEME tablosuna bu işlem ile ilgili ACIKLAMA alanına 'CİNSİYET DEĞİŞTİRİLDİ.' bilgisi yazılır. Burada WHEN ifadesi ile sadece CINSIYET alanına değişiklik yapıldığında tetikleyici içindeki ifadeler çalıştırılır.

           Tetikleyiciyi oluşturduktan sonra bu tetikleyiciyi çalıştıracak sql komutlarını yazalım. Öncelikle deneme tablosuna cinsiyeti 'ERKEK' olan bir kayıt ilave edelim.

           INSERT INTO DENEME (KEY,AD,SOYAD,CINSIYET) VALUES(DENEMESEQ.NEXTVAL,'KEVSER','GÜMÜŞ','ERKEK')

           Tetikleyicide UPDATE ifadesi kullanıldığı için, INSERT veya DELETE işlemleri sonucu tetikleyici çalışmaz, sadece UPDATE işlemi sonrası çalışır.

           Kaydımızı kontrol edelim. SELECT * FROM DENEME

KEY AD SOYAD CİNSİYET
1 KEVSER GÜMÜŞ ERKEK

           Şimdi ise bu kaydımızın cinsiyet sütunundaki değeri değiştirelim.

           UPDATE DENEME SET CINSIYET = 'KADIN' WHERE KEY = 1

           Yapılan bu güncelleme komutu ile tetikleyici çalışacak ve LOGDENEME tablosuna bir kayıt ilave edecektir. Şimdi LOGDENEME tablomuzu kontrol edelim.

SELECT * FROM LOGDENEME

KEY AD SOYAD CİNSİYET ZAMAN AÇIKLAMA
1 KEVSER GÜMÜŞ ERKEK 21.04.2003 19:13.27 CİNSİYET DEĞİŞTİRİLDİ

           Not: Tetikleyici içinde transaction kontrolü yapılmaz. Bu nedenle tetikleyici için ROLLBACK ve COMMIT komutları kullanılamaz.

           Tetikleyicileri etkisiz hale getirmek:

           ALTER TRIGGER komutu ile tetikleyiciler çalışır/çalışmaz duruma getirilir.

           Alter Trigger DenemeTrigger1 Disable;

           Bu komut ile DenemeTrigger1 tetikleyicisi çalışmaz duruma getirilecektir. Çalışmaz durumda olan tetikleyiciyi açık durumuna getirmek için;

           Alter Trigger DenemeTrigger1 Enable;

           Komutu kullanılır.

           Bir tabloya ait tüm tetikleyicileri çalışmaz durumuna getirmek için aşağıdaki SQL ifadesi kullanılır.

           Alter Table Deneme Disable All Triggers;

           Deneme tablosuna ait tüm tetikleyicileri çalışır duruma getirmek için;

           Alter Table Deneme Enable All Triggers ;

           Komutları kullanılır.

           Veri tabanınızda tanımlı bulunan tetikleyiciler hakkında bilgi almak için; 1.USER_TRIGGERS
2.ALL_TRIGGERS
3.DBA_TRIGGERS

           görüntü tabloları kullanılır.

           Select trigger_name, trigger_type, triggering_event, table_name from User_triggers where table_name = 'DENEME'

           Select trigger_name,trigger_type,triggering_event,table_name from All_triggers where table_name = 'DENEME'

           Select trigger_name,trigger_type,triggering_event,table_name from Dba_triggers

TRIGGER_NAME TRIGGER_TYPE TRIGGER_EVENT TABLE_NAME
DENEMETRIGGER AFTER EACH ROW UPDATE DENEME

           Yaratılan tetikleyicileri silmek için DROP TRIGGER komutu kullanılır.

           Drop Trigger DenemeTrigger1

           Not: Tetikleyici çalışırken başka bir tetikleyiciyi çağırabilir. Bu yüzden tetikleyici hazırlarken buna dikkat edilmesi gerekir. Sadece gerektiğinde kullanılmalıdır.

           Örnek: LogDeneme tablomuza Alter Table komutu ile 1 karekter boyutunda TIP isimli kolon ilave edelim.

           Alter Table LogDeneme ADD (TIP VARCHAR2(1))

           Deneme tablosunda silme veya güncelleme işlemi öncesi işlem tipini de 'TIP' değişkenine aktararak LOGDENEME tablosuna işlem tipini de saklayalım.

CREATE OR REPLACE TRIGGER DenemeTrigger2 BEFORE UPDATE OR DELETE ON Deneme
FOR EACH ROW
DECLARE
TIP VARCHAR2(1);
BEGIN
IF DELETING THEN
TIP := 'D';
ELSE
TIP := 'U';
END IF;
INSERT INTO LOGDENEME
(LOGKEY,KEY,AD,SOYAD,CINSIYET,ZAMAN,ACIKLAMA,TIP)
VALUES (LOGDENEMESEQ.NEXTVAL,:OLD.KEY,:OLD.AD,:OLD.SOYAD,:OLD.CINSIYET,SYSDATE,'CİNSİYET DEĞİŞTİRİLDİ.',TIP);
END;

           Şimdi tetikleyiciyi çalıştıracak. Sql'leri çalıştıralım. Sonra LogDeneme tablomuzu kontrol edelim.

           INSERT INTO DENEME (KEY,AD,SOYAD,CINSIYET) VALUES (DENEMESEQ.NEXTVAL,'AHMET','ÖRNEK','KADIN')

           Daha sonra ilave ettiğimiz bu kaydın cinsiyetini düzeltelim ve sonra silelim.

           UPDATE DENEME SET CINSIYET='ERKEK' WHERE KEY=2

           DELETE FROM DENEME WHERE KEY=2

           Şimdide tetikleyicimiz. LOGDENEME tablomuza neler ilave etmiş kontrol edelim.

LOGKEY KEY AD SOYAD HS_KEY HS_AD AÇIKLAMA TIP
1 1 KEVSER GÜMÜŞ ERKEK 21.04.2003 19:13.27 CİNSİYET DEĞİŞTİRİLDİ 1
2 2 AHMET ÖRNEK KADIN 21.04.2003 19:13.27 CİNSİYET DEĞİŞTİRİLDİ U
6 2 AHMET ÖRNEK KADIN 21.04.2003 19:14.10 CİNSİYET DEĞİŞTİRİLDİ D