Forum
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 🙁 )
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.
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.
Ç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?
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 [;)]
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 ....
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.
Teşekkür ederim hocam...