SQL Server

SQL Server Trigger Kullanımı Örneği (Ürün -Satış)

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.

trigger_ornek_3

trigger_ornek_4

Tablolarımızıtasarladıktan sonra Satış tablosundaki “satisurun” alanı ile Urun tablosundaki “urunid” alanı arasındaki ilişkiyi oluşturuyoruz.

trigger_ornek_1

Şimdi Urun tablomuza deneme amaçlı birkaç kayıt girelim.

trigger_ornek_2

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.

trigger_ornek_5

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.

trigger_ornek_7

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.

trigger_ornek_8

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.

trigger_ornek_9

İş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_ornek_6

Trigger üzerinde sağ tıklayarak Modify dedikten sonra istenilen değişiklik uygulanarak Execute edilebilir.

10 Yorum

  • 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;

  • 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

    • 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

Yorum yap