Respond needs javascript to run. To find out more click here
Sql trigger nedir resimli anlatım » Rollback, Trigger, Create, Return, Delete, Formula » Serdar Demir Uefa Maçları Canlı İzle
RSS
 

Sql trigger nedir resimli anlatım

01 Ağu

Sql trigger

Trigger nedir?

Trigger tetikleyici anlamına gelir programlarımızda belirli bir işlem gerçekleştiğinde programımızı tetiklemeye yarar veya tablolar arası veri bütünlüğünü korumak için kullanılırlar. Aslında triggerlar bir store proceduredür fakat farkı kendiliğinden çalışmasıdır.

Triggerlarda ya hep ya hiç mantığı vardır yani program zorlukla karşı karşıya kaldıgında bütün işlem geri döner. Örneğin atmden para çekiyorsunuz parayı aldığınızda sizin hesabınızdan para düşülmemişse işlemin yarısında elektrik kesilmişşe vb. Olaylarda yapılan bütün işlemler iptal olur geri döner (transaction konusunda ayrıntılı anlatcağım)Bu işlemi rollback transaction ifadesi ile gerçekleştirir trigger tanımlamamız içinde transaction blogu olması gerekir.

Rollback transaction ifadesini minimum düzeyde kullanmamız önerilir çünkü büyük veritabanlarında bu işlemlerin yapılması çok büyük yük oluşturur buda performasın düşmesine sebep olur. Triggerlarla silme, güncelleme, ekleme işlemlerini yapabiliriz. Yani bir tabloda birden fazla trigger tanımlayabiliriz.

Trigger tanımlama:

Tabloyu seçip all tasks/manage triggers diyerek bize aşağıdaki gibi hazır bir şablon oluşturur.

Bu şablonu kendi triggerımıza göre tasarlayacağız. Triggerımıza bir isim veriyoruz daha sonra for insert,delete,update işlemlerinden  birini seçiyoruz(trigger seçtiğimiz işlem gerçekleştiğinde devreye girecek)

Delete triggerı :

Bu trigger tablodan silme işlemlerinde tetiklenir ve silinen verinin bir kopyasını deleted tablosunda saklar bunu  Örnek bir trigger oluşrarak anlatalım

Veritabanımızdan veri silmek istendiğinde hem silme işlemini önleyelim hemde silemezsin mesajı yayınlayalım.

Create trigger silme

on serdar for delete

as

if(select count(*) from deleted)>0

begin

raiserror(‘ Oops Bu tablodan veri silemezsiniz !!’,16,1)

//bu sayılar ne diye aklınıza bi soru gelebilir billiyodum ama unuttum gereksiz bişeydi

Rollback transaction

Return

End

Bu kodu üstteki formda veya query analayser da çalıştırdığımızda trigger oluşturuluyor bunu üstteki resimde new yazan açılır listede şeklinde trigger oluşturduğunu görürüz.

Gelelim triggerımızı denemeye tablomuzdan adı serdar olan kaydımızı silmeye çalışalım.

Delete from serdar where isim=’serdar’

Bu hata mesajı ile karşılaşıyoruz.

Insert triggerı:

Bir tablo içerisine veri eklemek için insert ifadesi kullanılır. Bu trigger insert işlemi gerçekleştiğinde inserted diye sanal bir tablo oluşturur ve ana tabloya eklenen veri inserted tablosuna da eklenir. İnsert triggerını bir uygulama ile açıklayalım: Sql final sınavında soruyu yanlış anlayıp yazdığım triggera benzer bir örnek J  Diyelim ki internetten satiş yapan bir firmayız satılan mallar giriş yapılan mallar stok durumunun tutlduğu tablolarımız var örneğin stok tablomuzda stok miktarı satılan  adet ve kalan adetleri saklıyoruz diger tablomuz ise satış tablosu bu tabloda satılan malın adı fiyatı vb. özellikler tutuluyor şimdi satış tablosuna bir kayıt girildiğinde benim stok tablomda satılan adetin artmasını ve elimde kalan miktarın azalmasını istiyorum bu beni iki tabloyada kayıt yapmaktan kurtaracak  gelelim triigera;

Create trigger stok_guncelle

On satis

For instert as

Update stok set stok.satilan=stok.satilan+1 from stok inner join inserted on stok.urun_id=inserted.urun_id

// biraz açıklama ekleyelim bir mal sattıgımız zaman diyelim mp3 çalar id si 1 olsun şimdi ben satış tablosuna bir kayıt eklediğimde stok tablosunda satilan sütununun  değeri 1 artacak kalan 1 azalacak (bu bir azalma kısmını Formula yoluyla tablo dizayn kısmında Formula alanına (stok-satilan) yazarak sağlıyoruz)

Aynı işlemi ürün aldığımızda da kullanabiliriz gördüğünüz gibi sadece trigger oluşturuyoruz ve otomatikmen olay gerçekleştiğinde devreye giriyor.

Son trigger çeşidimiz update triggerı:

Bu triggerımızı da delete triggerı gibi basit bir örnekle açıklayalım bu tablomuzun güncellenmesini önleyelim

Create trigger guncelle

On satis

For update as

İf update(numara)

Begin

Begin transaction

Raiserror(‘Güncelleme yapılamaz’,10,1)

Rollback transaction

Return
 
 

Tags: , , , , , , , ,

Leave a Reply

 

 
  1. yuhubaa

    23 Ekim 2009 at 15:46

    Kullanan ve deneyen arkadaşların yorum ve önerilerini dinlemek isterim

     
  2. yuhubaa

    25 Ekim 2009 at 15:59

    ayrıca siteye ddl triggeri ile ilgili makale de eklenmiştir

     
  3. ilhan

    01 Kasım 2009 at 08:02

    Hocam peki ben şimdi bi triger yazdım çok güzel şöyleki ; stok,satış,urun tablolarım var , satış tablosna bir triger yazdım her satış için stok adetini eksiltiyor ama C# da rollback kısmına düştüğü an hata veriyor , RollBack de tabi stok adedi satışdan az olunca oluyor . yani Stok adedi satılmak istenenden az ise rollback yapıp satışı da iptal etmesini istiyorum kod şöyle

    ALTER TRIGGER [dbo].[Trigger1]
    ON [dbo].[Satis]
    FOR INSERT
    AS
    BEGIN
    declare @uid int , @adet int ,@stokadet int

    select @uid=UrunID,@adet=Adet from inserted

    select @stokadet=StokAdet From Stok where urunID=@uid

    if @adet<=@stokadet
    begin
    update Stok set StokAdet=Stokadet-@adet Where UrunID=@uid
    end
    else
    BEGIN
    ROLLBACK
    END

    ama hata alıyorum C# da hata şu ;

    The transaction ended in the trigger. The batch has been aborted.

    Teşekkürler

     
  4. yuhubaa

    01 Kasım 2009 at 08:19

    Öncelikle yeni bir ürün geldiğinde stok tablonun artması içinde bir trigger yazmış olman lazım zaten var diyosan Trigger olşturuken if not exists(select * from …….) deyip kontrol edebilirsin veya count() ile sayısını alıp kontrol ettirebilirsin bu konuyla ilgili bir makale var sitede transaction ile alakalı okumanı tavsiye ederim

     
  5. felix

    15 Mart 2010 at 16:07

    merhaba hocam ! size sorum su ! ben daha cok yeniyim .. tablo olusturma .. gibi konulari yapiyorum primarry key olayini .. yanlis procedureler ile sorunlarim var umarim yakin zamanda sayenizde duzeltirim ancak ben daha once gormedim yani okudughum kaynaklardan c# kodlamalari yada daha dogrusu sunu diyeyim donguler sql de kullaniliyormu !! duymamistimda .. eger oyleyse butun donguleri kullanabilirmiyiz mesela siz if kullanmissiniz ! diger foreach for while gşbş bisey kullanmamiz gerekiyormu ? arti

     
  6. felix

    15 Mart 2010 at 16:11

    merhaba hocam ! size sorum su ! ben daha cok yeniyim .. tablo olusturma .. gibi konulari yapiyorum primarry key olayini .. yanlis procedureler ile sorunlarim var umarim yakin zamanda sayenizde duzeltirim ancak ben daha once gormedim yani okudughum kaynaklardan c# kodlamalari yada daha dogrusu sunu diyeyim donguler sql de kullaniliyormu !! duymamistimda .. eger oyleyse butun donguleri kullanabilirmiyiz mesela siz if kullanmissiniz ! diger foreach for while gşbş bisey kullanmamiz gerekiyormu ? arti mumkunse bu primary key hakkinda sunu sormak istiyorum ! ornegin ben bir sirket database i olusturdum ! ve bu sirketin alt sirketleri var holding gibi ve bu alt sirketlerin subeleri sube databaseleri ve bu alt sirketlerin databaseleri holdinge bagli yani holdinge stop girisi yapildiginda alt sirketlere stoklar dagitilacak ! ve soyle olmasi gerekiyor bu holdingdeki database ci butun subelerin ve alt sirketlerin databaselerindeki tanlolari kendi ekranina cekecek .. bu mumkun sanirim ancak bu databaselrin herbirine bir id atamasi yapilacakmi? demek istedigim primary key hepsinde olacakmi? nasil olacak anlayamadimda help me !! umarim anlamissinizdir .. biraz karisik oldu ama .. idare edin artik ..

     
  7. yuhubaa

    15 Mart 2010 at 16:14

    elbette sql kısmında döngüleri kullanabiliyoruz fakat bazılarını örneğin if…else , begin…. end , case…when gibi döngü yapılarını kullanabilirsin hatalarla karşılaştığın zaman try catch bloklarını da kullanabilirsin.

     
  8. yuhubaa

    15 Mart 2010 at 16:31

    bence 3 tane tablon olması gerekiyor bunlar satis tablosu, stok tablosu depodurumu diye bu tablolar arasında ilişkileri kuracaksın bunuda trigger içerisinde bir döngü ile gerçekleştirip stok girişi yapıldığında artık ilişkiyi hangi alana göre kurarsan ben sana ürün koduna göre ilişki kurmanı öneririm şubelerin hepsi stok durumunu görebilir bir satış yapıldığında stok ta azalma olur ve satıs tablosuna trıgger ile otomatik kayıt yaptırırsın

     
  9. NETLINE_tarik

    19 Ekim 2010 at 03:48

    merheba;

    hocam fatura girişi esnasında vade tarihini zorunlu alan haline getirmek istiyorum. bunu nasıl gerçekleştirebilirim.

     
  10. NETLINE_tarik

    21 Ekim 2010 at 02:20

    hocam ilginiz için çok teşekkür ederim. rica etsem örnek gönderebilirmisiniz. ayrıca trigger kullanımı için bir dökümanınız varsa onu da ek olarak gönderirseniz benim için çok iyi olur. iyi günler.

     
  11. Ahmet

    14 Nisan 2011 at 03:05

    Hocam çok güzel şeyler paylaşmışsınız ama nanın bunu bir video ile anlatmış olsaydınız herkes size minnettar kalırdı…Ben ist. ünv. böte öğrencisiyim ve sitenizin sadeliği çok hoşuma gitti bunu da ayrıca belırtmek ıstıyorum. başarılarınızın devamını dılıyrm saygılar

     
  12. bigcat

    08 Ocak 2012 at 08:15

    ” raiserror(‘ Oops Bu tablodan veri silemezsiniz !!’,16,1)

    //bu sayılar ne diye aklınıza bi soru gelebilir billiyodum ama unuttum gereksiz bişeydi ”

    yanlış biliyorsunuz hiçde gereksiz bişey değil konuyu araştırmanızı tavsiye ederim.

    Konunun önemini anlayınca belki ayrı bi makale yazmak istersniz.

    İyi çalışmalar…