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