Forum

Trigger After Delet...
 
Bildirimler
Hepsini Temizle

Trigger After Delete

8 Yazılar
3 Üyeler
0 Reactions
2,535 Görüntüleme
(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Merhaba arkadaşlar

Bir Delete Triggeri oluşturmaya çalışıyorum

aslındaÖğrenmek istediğim

 Bunu nasıl yaparım "Ogrenci Tablosu var ve "sondurum" olarak bir stunum var 1 ve 0 degerlerini tutuyor

yapmak istediğim eğer "sondurum" stunu 0 degerini tutuyorsa silinmesini engellemek yok eğer 1 ise silinsin"

Ben bu olayı yaptım ancak saçma oldu anlayamadım nasıl oldugunu

kodlarım şu şekilde(Bu benim yazdııgm kodların açıklamasını yapmanız mümkünmü ?)

 

create trigger OgrencıSil

on [DeleteTrıggerOrnegı(OGrencı)]

after delete

as

if exists(

 select * from [DeleteTrıggerOrnegı(OGrencı)] D inner join deleted DE

 on d.sondurum=DE.sondurum)

begin

print('asd')

rollback

end

(Bu kodalar istediğim gibi çalışıyor yani 0 ise silmesini engelliyor değilse siliniyor ama bu nasıl oluyor anlamış değilim 🙁 ) 

 

 

 

 
Gönderildi : 07/03/2011 16:36

(@turgaysahtiyan)
Gönderiler: 344
Reputable Member
 

senin kodun tam olarak nasıl çalıştığını bilmiyorum. delete den önce balki bazı alanları update yapıyorsundur.


Ama işini şu trigger çözecektir.


create trigger OgrencıSil


on [DeleteTrıggerOrnegı(OGrencı)]


after delete


as


if exists(select * from deleted where sondurum=0)


begin


print('asd')


rollback


end


 


yalnız bunda da eğer toplu delete gönderirsen ve bunların içinde silinmemesi gereken kayıt varsa tamamını silmeyecektir. Bu durumda program içinden kontrol yapman gerekecek.

 
Gönderildi : 08/03/2011 20:55

(@cozumpark)
Gönderiler: 16307
Illustrious Member Yönetici
 

Sanırım silme işlemini önleyen başka bir işlem var çünkü bu trigger silmek istediğiniz ne varsa siler.


Bunu test etmek için aşağıdaki sorguyu çalıştırın.


DELETE FROM [Test].[dbo].[DeleteTrıggerOrnegı(OGrencı)]


Bu sorguyla tablomuzun içindeki tüm verilerin silinebildiğini göreceksiniz. Yani sizin trigger sondurum değerinin 0 ya da 1 oluşuna göre karar veremeyecek.


Bizimle veri silmek için kullandığınız sorguyu paylaşır mısınız? Muhtemelen


DELETE FROM [Test].[dbo].[DeleteTrıggerOrnegı(OGrencı)] WHERE sondurum<>0


tarzında bir silme sorgunuz. Trigger'a da deleted tablosundan sondurum=0 değerini içeren veri gelmediği için bunları silmiyor (Yani trigger boşuna çalışıyor).


İyi çalışmalar.

 
Gönderildi : 09/03/2011 14:19

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Çok teşekkür ederim arkadaşlar...

Bende aslında anlamadım benim kodum dün yaptığım silme işleminde silmeyi engelliyordu ama bugun hepsi çok güzel siliniyor 🙂

sanırım başka bişe vardı

Genede eğer mümkünse

burdaki

create trigger OgrencıSil

on [DeleteTrıggerOrnegı(OGrencı)]

after delete

as

if exists(

 select * from [DeleteTrıggerOrnegı(OGrencı)] D inner join deleted DE

 on d.sondurum=DE.sondurum)

begin

print('asd')

rollback

end 

 

Şu "if exists(

 select * from [DeleteTrıggerOrnegı(OGrencı)] D inner join deleted DE

 on d.sondurum=DE.sondurum)" olayın tercümesini yazarmısınız?

Nediyor yani burda?  

 
Gönderildi : 09/03/2011 23:08

(@cozumpark)
Gönderiler: 16307
Illustrious Member Yönetici
 

deleted özel bir tablodur. Silme işlemi esnasında silinen kayıtlar bu tabloda tutulur. Diyor ki eğer deleted tablosunun sondurum sütunu ile aynı değere sahip olan değerler DeleteTrıggerOrnegı(Ogrencı) tablosunun sondurum sütununda varsa hiçbirşey silme.


Zaten DeleteTrıggerOrnegı(Ogrencı) tablosunda deleted tablosundaki değerleri tamamen sildiğiniz için if exists içine yazdığınız kısım hiçbir sorgu döndürmez çünkü zaten deleted sizin bu tablodan çıkardığınız kayıtlardan oluşuyor. Hiçbir eşleşme olmadığı için de rollback hiçbir zaman tetiklenmiyor.


Durum basit yani [;)]

 
Gönderildi : 10/03/2011 02:13

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Mert hocam yanıt için çok teşekkür ederim aslına bakarsanız join işleminin ne anlama geldiğini anlayabilecek kadar bilgiye sahip oldugumu düşünüyorum ancak Trigger ler içerisinde anladığım(yada anlayamadığım) kadarıyla mantık biraz farklı işliyor

örneğin Turgay hocamızın vermiş olduğu örneği ele alalım

"

if exists(select * from deleted where sondurum=0)

begin

print('asd')

rollback

end

"

Burda benim(Yanlışım varsa düzeltin lütfen...) anladığım şu silme işlemi sırasında Trigger çalışıyor ve kendine has bir tablo oluşturuyor ve bu tabloda eğer  "select * from deleted where sondurum=0" sorgusu sonucu kayıt dönüyorsa Begin End bloguna gir ve Rollback ini yaptırıyor ve en son oluşturdugu Deleted tablosunu sonlandırıyor(siliyor sanırım...)

ancak ;

Benim yazdığım kod belki burda gereksiz veya saçmadır ama genede  sormak istiyorum

"

if exists(

 select * from [DeleteTrıggerOrnegı(OGrencı)] D inner join deleted DE

 on d.sondurum=DE.sondurum)

begin

print('asd')

rollback

end

 

Burdada

"select * from [DeleteTrıggerOrnegı(OGrencı)] D inner join deleted DE

on d.sondurum=DE.sondurum)"  sorgusu dönüyorsa ;ki mantıksal olarak dönmesi gerektiğini düşünüyorum çünki Trigger öğrendiğim kadarıyla komutun sonuna kadar bekliyor Rollback ihtimaline karşı ve bu yüzden silme işlemini gerçekleştirmiyor bu durumda DeleteTrıggerOrnegı(OGrencı) ve deleted tablolarında "sondurum"stunları u eşit olan kayıt oluşuyor ve Join işlemi pozitif yanıt veriyor yani dönüyor veya dönmesi gerekiyor gibi bi yorum var kafamda

Aslına bakarsanız anladıgım kadarıyla burda sormam gereken tek bir soru var sanırım

o da;

Trigger çalıştı kendi deleted tablosuna silinecek olan kayıtları koydu ama bu sırada bu kayıtlar genel tablodan silinmiş duruma giriyorlar ve trigger eğer hata yoksa kayıtların silinmesine izin veriyor ve kendi deleted tablosunu yok ediyor ama yok eğer trigger Rollback e girdiyse veya hata filan oluştuysa deleted tablosunda ki bulunan kayıtları tekrar genel tabloya gönderiyor ve silinmiyorlar

Bu işlemler bu şekilde mi gerçekleşiyor?Anlamadığım bi taraf varmı acaba?

Teşekkürler .... 

 

 
Gönderildi : 10/03/2011 02:41

(@cozumpark)
Gönderiler: 16307
Illustrious Member Yönetici
 

Yanlışınız var evet. Silme işleminden sonra trigger için veri tabloda bekletilmez. Silinen veri eğer yapıda trigger varsa deleted tablosuna yazılır yoksa silinir gider. Ardından da eğer varsa trigger tetiklenir. Bu yüzden sizin bahsettiğiniz eşitlik hiçbir zaman oluşmaz [;)] Yanılgının kaynağı burası zaten.


Son paragrafta siz de durumu çözmüşsünüz zaten.


İyi çalışmalar.

 
Gönderildi : 10/03/2011 02:52

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Teşekkür ederim hocam...

 
Gönderildi : 11/03/2011 02:06

Paylaş: