SQL 2005 Express Edition Trigger Sorunu

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen vkamadan »

Merhaba,
SQL Server 2005 Express Edition kullanıyorum, bir AFTER UPDATE triggeri yazdım aşağıdaki gibi ,

Kod: Tümünü seç

CREATE TRIGGER [dbo].[deneme1_tru] ON [dbo].[deneme1]
WITH EXECUTE AS CALLER
FOR UPDATE
AS
BEGIN
 declare @DEGER VARCHAR(20)
  select @DEGER = ALAN_STR1 from Inserted
  
  INSERT INTO trgMesaj (deger) VALUES(@DEGER)
END
GO
burada aslında bir konuyu test etmek istemiştim, örneğin "deneme1" tablosudaki birden fazla satırı güncelleyen bir UPDATE ifadesi sırasında acaba bu trigger güncellenen her satır için ayrı ayrı çalışıyormu yoksa bir defamı çalışıyor, ve kaç satır değişirse değişsin sadece bir defa çalıştığını gördüm bu benim için ciddi bir sorun ve anlamsız geldi ben bir defada kaç satır değişirse değişsin bu trigger in her satır için çalıştırılmasını istiyorum bu mümkün mü?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen aslangeri »

s.a.
bir cursor tanımlayıp insert edilen kayıtları bu cursora atacaksınız sonra döngü ile cursordaki kayıtları tek tek istediğini tabloya insert edeceksiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen sabanakman »

vkamadan yazdı:..birden fazla satırı güncelleyen bir UPDATE ifadesi sırasında acaba bu trigger güncellenen her satır için ayrı ayrı çalışıyormu yoksa bir defamı çalışıyor, ve kaç satır değişirse değişsin sadece bir defa çalıştığını gördüm...
Malesef SQL Server için bu problem var ve @aslangeri'nin dediği gibi her satırı teker teker değiştirmen gerekiyor. Toplu değişikliklerde ilk satır için trigger çalışıyor, diğerleri için çalışmıyor. Umudumuz SQL Server 2008. Umarım onda bu problem devam etmez ve tüm değişen satırlar için trigger çalışır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen vkamadan »

Peki çok teşekkür ederim yardımlarınız için, bu durumda benim gözümde MS SQL üzerindeki Trigger yapısının hiç bir anlamı kalmamış oldu.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen akdatilla »

Merhaba
Benve mssql'in trigger çalıştırma yöntemi firebird'e göre çok gelişmiş.
Firebird her satır için trigger'i çalıştırıyor. Diyelimki 100 satırı değiştiren bir update işlemi yapıldı. bu durumda firebird 100 kere trigger çalıştırıyor.

Ancak mssql 100 satırı değiştiren bir update işlemi sonucunda bir kere trigger çalıştırır. İşlenen 100 satırı deleted ve inserted tablolarına gönderir.
Bu sanal tablolar üzerinden güncellemeler cursor vb bir yöntemle rahatlıkla kullanılabilir.
Toplu insert,delete ve update işlemlerinde mssql ile firebird trigger işlemleri tarasında büyük bir hız farkı oluşur diye düşünüyorum.
Ama doğrusu test etmedim.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen sabanakman »

1-SQL tabanlı veritabanı kullanmaya karar vermenin ücreti yoktur.

2-Ona hakim olabilmek ise emek ister.

3-Ana tablodan silinen bir kayıt karşılığında detayın da silinmesini hesap etmek fakat sorgu ile silinen bir grup kayıttan sadece ilk kaydın detayının silindiğini görüp hayallerinizin yıkıldığını görmenin bedeli ise paha biçilemez :twisted: (bu örnek değişik biçimlere de uyarlanabilir)

Tabi 2. maddeyi güçlendirerek bu durumun üstesinden gelebilirsiniz ve hesap ettiğiniz yere geldiğinizde artık olması gerekenden daha çok şey öğrenmişsinizdir :N) :N)
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen aslangeri »

s.a.
bana görede fb nin trigerları daha gelişmiş.
fb de update trigerinda alanların önceki ve sonraki değerlerine rahatlıkla ulaşabiliyorum.
ancak mssqlde bu işlemi yapmak benim için işkenceye dönüyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen sabanakman »

Aslında

Kod: Tümünü seç

select @eskideger=alan from deleted
select @yenideger=alan from inserted
isimli tablolarla eski ve yeni değerlere rahatlıkla ulaşılabiliniyor ve elde edilen değerleri değişkenler üzerinden kullanmak mümkün hale geliyor. Çok zor değil ama, FB'de durumlar nasıl?
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen vkamadan »

Merhaba,
Evet açıkçası ben MS SQL in performans gözetmek için böyle bir trigger yolu izlediğini hiç tahmin etmemiştim ve bunu bir eksiklik olarak görmüştüm, DELETED VE INSERTED tablolarının yapılarını daha derinlemesine incelediğimde, database i etkileyen her command text için her session için ayrı birer sanal tablo oluştuğunu ve ilgili tablolarda sadece o an etkilene satırların yer aldığını gördüm, ve cursor metodlarıyla yapılmak istenen işlerimlerin rahatlıkla ve hızlı bir şekilde yapıldığına testlerim sonucunda şahit oldum.
İlgilenen arkadaşlar için çok teşekkür ederim.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen Battosai »

Malesef SQL Server için bu problem var ve @aslangeri'nin dediği gibi her satırı teker teker değiştirmen gerekiyor. Toplu değişikliklerde ilk satır için trigger çalışıyor, diğerleri için çalışmıyor. Umudumuz SQL Server 2008. Umarım onda bu problem devam etmez ve tüm değişen satırlar için trigger çalışır.
SQL server'a baksen bide bundan para istiyorlar...MySQL bu işi standart olarak yapıyor.Zaten trigger yapısında FOR EACH ROW ifadesi nasıl çalıştığını açıklıyor...Gerçi MySQL trigger işine sonradan girsede ben şuan memnunum gayet güzel iş görüyor.Tek sıkıntısı trigger içindeki sorgu cümlesinde sadece bir tablo için çalışabilmesi...yeni sürümleride bu sıkıntıyıda hallederlerse tam süper olacak...
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Re: SQL 2005 Express Edition Trigger Sorunu

Mesaj gönderen fahrettin »

Aman arkadaşlar trigger konusunda bazı hurafeler mi oluşmaya başlamış yoksa .... :)
Satırları tek tek update etmek zorunda değiliz... Gönül rahatlığı ile toplu update ve insert komutlarınızı çalıştırabilirsiniz....

Row level ve statement level şeklinde iki tip trigger çalışma metodu vardır.... Bazı veritbanlarında triggerlar row level olarak çalışır yani her satır için ayrı ayrı tetiklenirler...(Sybase, Firebird...) Statement level trigger desteği olan veriabanlarında ise ilgili trigger bir komut için etkilenen kayıt sayısına bakılmaksızın bir defa tetiklenir... (MSSql deki gibi) Şimdi eğer bu durumu bilip de bu durumu yönetecek tirggerlar yazılmaz ise o zaman bahsedildiği gibi yazılan trigger kodlarında sadece ilk satır için çalışma gibi etkileri gözlenebilir... Toplu update yapılmamalı gibi yanlış neticeler çıkartılabilri.... Zaten Volkan Bey aşağıdaki mesajı ile durumu izah etmiş...
vkamadan yazdı:... DELETED VE INSERTED tablolarının yapılarını daha derinlemesine incelediğimde, database i etkileyen her command text için her session için ayrı birer sanal tablo oluştuğunu ve ilgili tablolarda sadece o an etkilene satırların yer aldığını gördüm, ve cursor metodlarıyla yapılmak istenen işlerimlerin rahatlıkla ve hızlı bir şekilde yapıldığına testlerim sonucunda şahit oldum.
İlgilenen arkadaşlar için çok teşekkür ederim.
Lakin şunu da eklemek isterim... Etkilenen bütün kayıtlar için bir işlem yapmanın tek yolu cursor kullanmak da değildir.... Daha kısa ve efektif kodlarla da benzer işleri yapabiliriz.... Volkan Bey'in yazdığı deneme triggerinı şu şekle çevirdiğimizde etkilenen bütün alanların değerleri ilgili tabloya insert edilecektir....

Kod: Tümünü seç

    CREATE TRIGGER [dbo].[deneme1_tru] ON [dbo].[deneme1]
    WITH EXECUTE AS CALLER
    FOR UPDATE
    AS
    BEGIN
      INSERT INTO trgMesaj (deger) 
      Select ALAN_STR1 from inserted
    END
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla