Bu yazımızda SQL Serverda Trigger kullanımının nasıl olacağını gösteren basit bir örnek oluşturacağız. Örneğimizde Insert Trigger, Delete Trigger ve Update Trigger kullanımını göreceğiz. Örneğimizde Satış yapıldığında ürüne ait stok bilgisinin otomatik olarak güncellenmesini sağlayacağız.
SQL Trigger Kullanımı ile ilgili daha geniş bilgi almak isterseniz aşağıdaki bağlantıya tıklayabilirsiniz.
Örneğimize geçelim. Örneğimizde kullanacağımız veritabanı ve tabloları aşağıdaki gibidir.
Veritabanımızın ismi dbMagaza ve Tablolarımız Urun ve Satis olacaktır.
Tablolarımızıtasarladıktan sonra Satış tablosundaki “satisurun” alanı ile Urun tablosundaki “urunid” alanı arasındaki ilişkiyi oluşturuyoruz.
Şimdi Urun tablomuza deneme amaçlı birkaç kayıt girelim.
Sırada Insert Trigger oluşturma işlemi var. Satış yapıldığında Urun tablosundaki stok yani urunadet alanında bulunan değerlerin eksilmesini sağlayacağız.
New Query (Yeni Sorgu) oluşturarak Insert Trigger‘ ı yukarıdaki gibi oluşturduktan sonra ve Execute dedikten sonra deneme amaçlı Satis tablosuna bir kayıt girelim.
Satış tablosuna bir değer girildiğinde Urun tablosundaki stok adetinin azaldığını görmüş olduk. Peki bu satıştan vazgeçilirse yani Satis tablosundan bir kayıt silinirse ne olacak? Bu iş için ise imdadımıza Delete Trigger yetişiyor. Satış tablosundan herhangi bir kayıt silinirse Urun tablosunda Stok adetinin yani urunadet alanının silinen kayıttaki adet kadar arttırılmasını sağlayalım.
Delete Trigger ‘ dan sonra şimdi de Update Trigger‘ ı oluşturacağız. Update Trigger hangi amaçla kullanılır? Öncelikle bunu açıklayalım. Eğer Satis tablosunda yapılan bir satı işlemi sonrası satış adeti değiştirilirse çalışması sağlanır. Bu işlem için ise aşağıdaki gibi kodlarımızı oluşturup Execute diyoruz.
İşlemlerimizi tamamlamış olduk. Eğer oluşturmuş olduğumuz Trigger (Tetikleyici) üzerinde değişiklik yapmak istersek, oluşturmuş olduğumuz Trigger‘lara aşağıdaki gibi erişebiliriz.
Trigger üzerinde sağ tıklayarak Modify dedikten sonra istenilen değişiklik uygulanarak Execute edilebilir.
Merhaba hocam bir sorum olacaktı
customer_order_line_tab tablosunda ship_via_code alanında birden fazla aynı değer olduğunda hata almak istiyorum aşağıda kodun içerisindede anlatmaya çalıştım bu konuda nasıl bir yol izleyebilirim
create or replace trigger SHIP_VIA_CODE_KONTROL
before insert on customer_order_line_tab
for each row
BEGIN
if :NEW.y.ship_via_code=’ BU kısımda 2 değer döndüğünde hatalı işlem oluyor SRV-KRG olarak count 1 den büyük olduğunda veya birden fazla değer geldiğinde hataya nasıl düşürebiliriz. ‘
THEN
error_sys.System_General(‘hata mj’);
END IF;
end SHIP_VIA_CODE_KONTROL;
Alanı unique yapsanız olmuyor mu
Olmaz şundan dolayı servis seçenekleri birden fazla master girilen değer detayda farklı bir değer seçilebiliyor bu hatayı gidermek için aslında
Merhabalar ,
Benim aklıma takılan şey bir triggeri tetiklediğim zaman başka bir tabloya kayıt yazmak . Ayrıca o tabloda oldvalue ne newvalue değerlerini görmek istiyorum biraz araştırdım ama bulduğum sonuçlarda iki ayrı tablodan join kullanılmış .Ben bunu istemiyorum tek bir tabloda hem eski değerini hem yeni değerini görmek istiyorum .
Bunun konu ile ilgili bir fikriniz var mıdır ? Sizden direk açık bir kod da beklemiyorum bir fikir ya da örnek bir link işime yarayacaktır. Şimdiden teşekkürler..
Ek olarak değişiklik yapılan tabloda birden fazla column da değişiklik olacak bu yüzden @oldvalue = n oluyor tek bir triggerde nasıl bir yol izlemem gerekir
Merhaba. Biraz daha detaylı aciklarmisiniz. Ornek olarak bir mail adresi guncelleme yapildiginda farkli tabloya o kişiye ait eski ve yeni mail adresi kaydedilmesi gibi birşey mi yapmak istediginiz. Bu arada isteğinizle hafta sonu ilgilenme şansımın olmadığınıda belirteyim.
Merhaba ,
Bir foto detay tablom var . Fotoları ilk olarak db ye insert ettiğimde detay alanları açılıyor ama null olarak doluyor sonradan fotoya bakarak gerekli olan alanları dolduruyorum .
Bu doldurma işlemini c# formdan yapıyorum .
Bende bunlar için kontrol olayını rahatlatmak için bir log tutmak istedim.
Değiştirdiğim her alan için log tabloma bir adet kayıt atsın ve loglarımı orada saklasın istiyorum . Zaten null ne gerek var diyecek olursanız . Bazı fotoğraflarda detay otomatik geliyor onlarda değişiklik yapılmışssa gözden kaçırmamak için . Ya da kontrol ederken mesela imla hatası var onu değiştirdim orada oldvalue işime yarıyor ama bunu birden fazla alan için yapamadım oldvalue yi tam olarak neye eşleyeceğim bilmiyorum .
Sorun yok baktığınız zaman bir yanıt verirseniz sevinirim
merhabalar sorunu c# üzerinden halettik . Teşekkürler
önemli değil
herhangi bir güncelleme yaptığınızda eski değer deleted yeni değer insterted tablolarında gözükür…inserted.alanadi join deleted.alanadi olarak işinizi görür