Forum
TRIGGER konusunda genis bir bilgi verecegim... Trigger konusu çok fazla karistirilan bir konu oldugu için makale disinda videolu ders te sitemize eklenecektir...
create trigger urunAdediGuncelle on satislar --1 for insert --2 as begin --3 declare @urunid int, @satisadedi int --4 select @urunid =urunid, @satisAdedi=satisAdedi from inserted --5 update urunler set urunadedi=urunadedi-@satisadedi where urunid=@urunid --6 end --7 |
create trigger satisIptalEt on satislar --1 for delete --2 as begin declare @urunid int,@satisadedi int select @urunid =urunid, @satisadedi=satisAdedi from deleted --3 update urunler set urunadedi=urunadedi+@satisadedi where urunid=@urunid --4 end |
create trigger SatisGuncelle on satislar for update --1 as begin declare @urunid int, @eskisatisadedi int, @yenisatisadedi int, @fark int select @urunid =urunid, @eskisatisadedi=satisAdedi from deleted --2 select @yenisatisadedi=satisadedi from inserted --3 set @fark=@yenisatisadedi - @eskisatisadedi --4 update urunler set urunadedi=urunadedi-@fark where urunid=@urunid --5 end |
Teşekkürler Barış.
Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************
Merhabalar
Öncelikle konu için teşekkürler yeni başlayan birisi olarak trigger kullanarak bir tabloya başka bir tabloya kopyalamayı nasıl yapabilirim acaba. Örn: Faturalar tablosunu başka bir tabloya aynı şekilde kopyalamak istiyorum koşul belirterek sadece "R" kodlu faturaları insert et gibi.
Merhaba Ufuk bey,
Aşağıda vereceğim kod insert işleminden sonra tetikleme yapmaktadır. Örnekte olduğu gibi @var_faturatipi kısmında eklenen değeri alıyorum ve bundan sonraki yapacağınız sql satırlarını sizin algoritmanıza uygun şekilde düzenliyebilirsiniz. Burada büyük olasılıkla birden fazla sütun ile çalışma yapacaksınız burada insert işleminin en kolay yolu;
INSERT INTO faturalar (SELECT * FROM inserted)
olabilir. Veyahut temp tablo ile değerleri girip ana tablonuzun yapısına uygun hale getirerekte aynı şekilde işlem yapabilirsiniz.
İyi çalışmalar
Trigger Insert After ;
END
Teşekkür Ederim Kenan Bey,
Rica ederim Ufuk bey herzaman..
Anlatımınız Çok Güzel. Teşekkürler...
Merhaba, eski bir yazı olduğunu biliyorum. Yine de bunu paylaşana teşekkür etmek istiyorum. Yaşadığım bir problem hakkında bana yardımcı olabilecek biri olursa sevinirim. A tablosuna insert sırasında A.refNu değerini alıp aynı veri tabanı içindeki B tablosundan ve C tablosundan veri çekmek istiyorum ancak B ve C tablolarından veri çekemiyorum. Nerede yanlış yaptığımı anlatabilirseniz sevinirim.
A=STOK HAREKET TABLOSU, B=FATURA FİŞİ TABLOSU, C=FATURA HAREKETLERİ TABLOSU, kayıt işlemi transaction ile yapılıyor, kullanıcı faturayı kayıt ederken satıcı kodunu giriyor ve kayıt etmeye başladığında sırasıyla önce B sonra C ve sonra A tablosuna kayıt ediliyor. Kayıt bittiğinde transaction kapatılıyor.
CREATE TRIGGER satKodGir
ON A
FOR INSERT (AFTER da denedim olmadı)
AS
BEGIN
DECLARE @stkRefNu INT, @fatFisRefNu INT, @fatHarSatKod VARCHAR
SELECT @stkRefNu=A.STKREFNU FROM inserted (STOK HAREKET TABLOSUNDAN STOK FİŞİNİN REFERANS NUMARASINI BULUR)
SELECT @fatFisRefNu=B.FISREFNU FROM B WHERE B.STKREFNU=@stkRefNu (FATURA FİŞİ TABLOSUNDA BAĞLANTILI FİŞİ BULUR)
SELECT @fatHarSatKod=C.SATKOD FROM C WHERE C.FISREFNU=@fatFisRefNu (FATURA HAREKETLERİ TABLOSUNDA BAĞLANTILI HAREKETİ BULUR)
UPDATE A SET A.SATKOD=@fatHarSatKod WHERE A.STKREFNU=@stkRefNu (STOK HAREKET TABLOSUNDA INSERT OLAN SATIRA SATICI KODUNU GİRER)
END
inserted dışındaki diğer SELECT sorguları çalışmadığından @fatHarSatKod değeri NULL geliyor ve UPDATE edemiyorum. Bütün tablolar aynı veri tabanında olmasına rağmen neden diğer tablolardan veri çekemiyorum ? Şimdiden teşekkür ederim
FOR INSERT,UPDATE denermisin yada birden çok begin end kullan
İlginiz için teşekkür ederim ancak önerdiğiniz yöntemler işe yaramadı. Yazdığım trigger daki değişken tanımlarını ve sorguları studio management da query de yazdığım zaman çalışıyor. Yani algoritmada bir sorun olmadığını böylece anlıyorum. Veya SELECT sorgularından önce SET @fatHarSatKod='TEST' şeklinde değişkene bir değer atadığımda, son satırdaki UPDATE zaten çalışıyor. Sanırım benim sorunum; trigger çalışırken farklı tablodan veri çekememek. Tablolar birbirleriyle ilişkili değiller, çeşitli referans numaraları ile birbirleri arasında iletişim kuruluyor. Sebebi bu olabilir mi ?
NOT : FROM inserted şeklindeki SELECT ile veri getirebiliyorum ve bende INNER JOIN gibi metodlarla tablolardaki kayıtları birbirine bağlayarak tek bir SELECT sorgusu ile değişkenlere değer atamak istediğim ancak bu seferde FROM inserted den bile değer getiremedim.
yukarıda yazdıklarımla birlikte update Table id=id blogunu araya ekleyin insertte olmazsa update de yakalarsın , muhtemelen insert sırasında sorun olabilir.
degiskeni print etkiniz de değer basıyormu.
Trigger içerisinde PRINT komutunun nasıl çalıştırılabileceğini bilmiyorum. Daha önce hiç karşılaşmamıştım. Araya eklememi önerdiğiniz kısmı anlayamadım acaba zahmet olmazsa komut satırlarını yazabilir misiniz. Teşekkürler.
PRINT @degisken
Birol bey çabanız için teşekkür ederim ancak ben PRINT komutunu sql de sadece herhangi bir veritabanında query sayfasında sorgularımı test etmek için kullandım. Yani PRINT @degisken şeklinde yazıldığını ve execute edildiğinde sorguyu yazdığım kısmın hemen aşağısına sonucu yazdırdığını biliyordum ancak trigger içerisinde yazdığımız PRINT komutu nasıl çalışacak ?
Mesela ben c# ile bir uygulama yazdım diyelim, butona bastım ve transaction oluşturarak sql sorguları tek tek çalıştırdım. Eğer transaction başarılı ise c# da ekrana "kayıt tamamlandı" veya try catch içinde sorun oldu ve hatayı mesaj olarak yazdırdım diyelim. Peki SQL management da ilgili tablo içinde düzenlediğim trigger yazıldıktan sonra PRINT komutu, ekrana bir mesaj kutusu mu çıkartır ? veya o sırada management açık mı olmalıdır ? Trigger içindeki PRINT komutu bana değişkenin değerini nasıl ve nerde gösterir ? Demek istediğim buydu.
Not : Sorunu yaşadığım yazılım şirkette kullandığımız ve kodlarına benim hakim olmadığım bir yazılım olduğu için trigger kullanmaya çalışıyorum. Yoksa kodları düzenler sizi de bu kadar yormazdım 🙂
hocam Telden yazdım icin yazıları tam okuyamıyorum , amacim set etkiniz değişkenleri hangi blokta kaybediyorsunuz bunu yakalamak ve orda update ile yeniden tetiklemek .
stored procedure e parametre olarak inserted kaydı göndermeyi denediniz mi acaba ?
Merhaba, stored procedure ile denememiştim. Bu öneriyi deneyeceğim, sonucu burdan tekrar yazarım. Teşekkürler herkese.
Benim ayrıca merak ettiğim konu şuydu : Aynı veri tabanında bulunan; A tablosu içinde oluşturulan bir trigger içinde B tablosundan veri çekmek mümkün mü ? Benim sorunum buydu, belkide trigger da böyle birşey mümkün değildir... ?
tablolara yazma sırasına göre degişen bi durum , fakat mümkün , yazma sırasında sorun olsa bile UPDATE ile tekrar tetikleyerek FOR INSERT,UPDATE ile ulaşabilirsiniz.
Peki X adlı tablom da 10 kayıt varsa kayıt ekleme işlemini nasıl engelleyebilirim?