Kod: Tümünü seç
Trigger Nedir
Örneğin stok hareketleri sonucunda stok miktarlarının azalması veya artması işlemlerinin, veya tahakkuk ve tahsilatlar sonucu cari hesapların etkilenmesi işlemlerinin triggerlar aracılığı ile yapılmaları tipik bir trigger kullanım yeridir. Ayrıca referential integrity’yi sağlamak amacı ile de trigger kullanımı çok tercih edilir. İlişkisel bir veritabanında örneğin PERSONEL tablosundaki kişinin bolum bilgisi amaçlı olarak BOLUM_NO tutulması ve bolumun adının da BOLUM tablosundan bulunması yapıldığını düşünürsek. Eğer 1 numaralı bolum herhangi bir personele kullanıldıysa BOLUM tablosundan BOLUM_NO değeri 1 olan kaydın kesinlikle silinememesi gerekmektedir. Bu tür kontrollerin yapılarak veri bütünlüğünün korunmasıdır referential integrity. Bu amaçla yazılan veya bir veritabanı tasarım aracı kullanıldıysa onun otomatik olarak yazdığı trigger kodları sayesinde bu bütünlük korunur. Çünkü BOLUM tablosunun delete trigger’inda gerekli kontrolleri yapacak kod yazılır ve eğer silinmek istenen BOLUM_NO herhangi bir personel için kullanıldıysa bu silme işlemine izin verilmez. [fahrettin abiden alıntı

Örnek 2 Tablo

ilk tablomuzda müşteri Sıranosu,adı,soyadı ve harcadığı paranın toplam miktarı bulunsun. ikinci tablomuzdada müşterinin aldığı mal ve fiyatları bulunsun.
ilk tablomuz TBL_MUSTERI ikinci tablomuz SATIS olsun. satış tablosunda aldığı malın fiyatı eksildiğide müşteri tablosundaki toplam_harcadigi alanındanda toplam eksilmeli. artırıldığında artmalı.
Aşağıdaki örnek bu görevi yapıyor.
Kod: Tümünü seç
SET TERM ^ ;
CREATE TRIGGER ILK_TR FOR TBL_SATIS
ACTIVE BEFORE UPDATE POSITION 0
AS
declare variable miktar DECIMAL(15,2);
begin
if (new.FIATI<>old.fiati) then
begin
if (old.fiati>new.FIATI) then
begin
miktar=old.fiati-new.FIATI;
update tbl_musteri set
tbl_musteri.toplam_harcadigi= tbl_musteri.toplam_harcadigi-:miktar
where tbl_musteri.sira=new.FOREGNKEY;
end
if (old.fiati<new.FIATI) then
begin
miktar=new.FIATI-old.fiati;
update tbl_musteri set
tbl_musteri.toplam_harcadigi= tbl_musteri.toplam_harcadigi+:miktar
where tbl_musteri.sira=new.FOREGNKEY;
end
end end
^
SET TERM ; ^
^ ; SP Bölümünde anlattığım ile aynı.
CREATE TRIGGER Triggeri oluştur komutu . Bu Komuttan hemen sonra Trigger ismi. ben ILK_TR yaptım. sonrasında For daha sonra triggerınızı hangi tablo için hazırladıysanız o tablonuun ismi. örnekte TBL_SATIS tablosu. ACTIVE yerine INACTIVE Kullanırsanız trigger olay oluşsa bile çalışmayacaktır. ACTIVE 'yi kullanmayabilirsiniz. varsayılan olarak ACTIVE dir zaten.
BEFORE veya AFTER Örneğimizde güncelleme tamamlanmadan önce kodları çalıştırtırdığımız için BEFORE yazıyoruz. BEFORE veya AFTER'den sonra olay adını yazıyoruz. UPDATE,DELETE veya INSERT olabilir.
POSITION 0 > Bir olay için birden fazla trigger yazabiliriz. POSITION'dan sonraki rakam Triggerların çalışma sıralarını belirtir. en küçük rakama sahip trigger önce çalışır. aynı olayda 3 Triggerımız olduğunu düşünürsek POSITION değerlerini 1,2,3 yerinne 10,20,30 yapın böylece 2 ile 3 arasında bir trigger eklemek isterseniz diğer triggerların Sayılarını değiştirmek zorunda kalırsınız.
as ve Begin arasına Stored Proceduredeki gibi Değişken tanımlayabilirsiniz.
Begin ve End arasınada komutlarımızı yazıyoruz.
Yukarıdki örneğimizde kayıt değiştiğinde önlemimizi almıştık. şimdi satış tablosuda kayıt silindiği zaman muşteri tablosundan değeri düşelim.
bunun için satış tablosu için before delete triggeri yazalım. kayıt silinmeden önce müşteri tablosundan değer düşülecek.
Kod: Tümünü seç
CREATE TRIGGER SIL_TR FOR TBL_SATIS
ACTIVE AFTER DELETE POSITION 0
AS
begin
update tbl_musteri set
tbl_musteri.toplam_harcadigi= tbl_musteri.toplam_harcadigi-old.fiati
where tbl_musteri.sira=old.FOREGNKEY;
end
şimdi satış tablosuda kayıt eklendiği zaman muşteri tablosundan değeri artıralım.
bunun için satış tablosu için before insert triggeri yazalım. kayıt eklendiğinde müşteri tablosunda da değer artacak.
Kod: Tümünü seç
CREATE TRIGGER EKLE_TR FOR TBL_SATIS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
update tbl_musteri set
tbl_musteri.toplam_harcadigi= tbl_musteri.toplam_harcadigi+new.fiati
where tbl_musteri.sira=new.FOREGNKEY;
end
Kod: Tümünü seç
NEW VE OLD
kayıt herhangi bir işleme tabi tutulurken IB / FB Tarafından old.alanadi stilindealan değerleri değişkenlere atanır.
yeni değerleride new.alanadi şeklinde yine değişkenlere atar.
yani Alan adından önce OLD alan değerinin değişmemiş hali NEW ise değişmiş hali. herhangi bir değişiklik yoksa New ile Old'un Değerleri eşittir
Kod: Tümünü seç
POST EWENT
Kayıtta herhangi bir değiişiklik olduğunda Delphiye IBEwent bileşeni yardımıyla Delphiye bildirir. özellikle ağdaki kullanıcıların değişikliği görebilmeleri için Refresh yapacağınız zamanı bilemnizi sağlar.
kullanımı
Kod: Tümünü seç
POST_EVENT "ismi";
örnek
Kod: Tümünü seç
POST_EVENT "yeniKayıtEklendi";
Aşağıdaki örnekte kolonun yeni değeri ismi olark seçiliyor.
Kod: Tümünü seç
POST_EVENT NEW.ALANADI;
Aşağıdaki örnek yeni kayıt eklendiğinde,silinndiğinde ve güncellendiğinde delphiye bildirir.
Kod: Tümünü seç
CREATE TRIGGER tr_kayit FOR TBL_MUSTERI
ACTIVE AFTER INSERT POSITION 0
AS
begin
post_event 'KAYIT_DEGISTI';
end
Trigger Düzeltme
Tek yapmanız Gereken CREATE Yerine ALTER Yazdıktan sonra TRIGGER ismini yazıp istediğiniz yerleri değiştirmek.
Kod: Tümünü seç
ALTER TRIGGER TR_KAYIT
ACTIVE AFTER DELETE POSITION 5
AS
begin
post_event 'KAYIT_DEGISTI';
end
Trigger Silme
Kod: Tümünü seç
DROP TRIGGER ADI;
Örnek
Kod: Tümünü seç
DROP TRIGGER TR_KAYIT;
NOT : SP de kullandığımız komutlar Trigger da kullanılabbildiği gib Trigger da kullandığımız komutlarda SP de kullanılabilir. Trigger ismide veritabanında tek olmalıdır. Trigger içinde tıpkı sp deki gibi sp çağırabilirsiniz.