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
yuhubaa
23 Ekim 2009 at 15:46
Kullanan ve deneyen arkadaşların yorum ve önerilerini dinlemek isterim
yuhubaa
25 Ekim 2009 at 15:59
ayrıca siteye ddl triggeri ile ilgili makale de eklenmiştir
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
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
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
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 ..
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.
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
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.
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.
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
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…