Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Trigger Oluşturma  (Okunma sayısı 5288 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Trigger Oluşturma
« : 08 Ekim 2005 01:36:24 »
Trigger Nedir
Bir tablo üzerinde belirli bir olaya bağlı olarak tetiklenip çalışan SQL kodlarıdır. Tablo üzerindeki triggerları tetikleyen olaylar insert, update, delete olaylarıdır. Bu olaylara istinaden 3 ana tip triggerdan bahsedilir. Bunlar insert triggerı update triggerı, delete triggerı şeklindedir. Bir tablo üzerinde bu olayların öncesinde ve sonrasında tetiklenecek istenildiği kadar trigger yazılabilir. Fakat genel eğilim ve kullanım her bir olay için tek bir trigger kullanmak şeklindedir.
Ö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: [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: [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: [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


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

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: [Seç]
POST_EVENT "ismi";örnek
Kod: [Seç]
POST_EVENT "yeniKayıtEklendi";Aşağıdaki örnekte kolonun yeni değeri ismi olark seçiliyor.
Kod: [Seç]
POST_EVENT NEW.ALANADI;Aşağıdaki örnek yeni kayıt eklendiğinde,silinndiğinde ve  güncellendiğinde delphiye bildirir.
Kod: [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: [Seç]
ALTER TRIGGER TR_KAYIT
ACTIVE AFTER DELETE POSITION 5
AS
begin
post_event 'KAYIT_DEGISTI';
end


Trigger Silme
Kod: [Seç]
DROP TRIGGER ADI;Örnek
Kod: [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.
« Son Düzenleme: 04 Mart 2006 14:02:08 by Fatih »
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Trigger Oluşturma Ve IBEvent Bileşeni
« Yanıtla #1 : 08 Ekim 2005 01:38:15 »
IB Expert'le Trigger Oluşturma
Triggersa sağ tıklayıp New Trigger dediğinizde aşağıdaki gibi bir pencere gelecektir

Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı ultrahalo

  • Yeni Üye
  • *
  • İleti: 10
  • Rep: +0/-0
Ynt: Trigger Oluşturma
« Yanıtla #2 : 17 Ocak 2011 11:17:38 »
fatih hocam mysql ile triggerda değer atanırken örneğin begin altına SET @MAX = (SELECT MAX(ID) FROM tablo_name) diyoruz. ibexpertte trigger da nasıl değişkene değer atıyoruz.verdiğim örnekteki gbi mi?