Triggerda new/old value

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ı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Triggerda new/old value

Mesaj gönderen gkimirti »

Trigger içinde bir alana ilk değer atamak için ne yapmalıyım
mesela bir tablodaki duruma göre başka bir tabloda update triggerinda bir alanın değerini değştireceğim.
Firebird de bu işlemler çok basif ve efektif ti
MSSQL neden bu kadar karıştırmış bir anlam veremiyorum.
Kaynak dersen berbat, MSDN içinde kayboluyor insan
Bazen sinir oluyorum şu muhasebe programlarında MSSQL kullandıkları için.....

Firebird de ne güzel

Kod: Tümünü seç

if new.alanadi is null then
  new.alanadi=0;
bu tarz basit bir yapı ile işimizi görüyorduk.
Yahu internette bu konu ile ilgili adam gibi bir kaynak olmaz mı?
Deli olmamak elde değil....
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Triggerda new/old value

Mesaj gönderen aslangeri »

s.a.
bildiğim kadarı ile mssql deki triger before insert için değil.
inser yapılmadan önce diğer tablolarla etkileşim için. mesela yeterince stok varmı?
tabloya insert edeceği değeri değiştirebileceğini zannetmiyorum.
yinde yanlış olabilirim. bilen arkadaş varsa aydınlatırsa sevinirim.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Triggerda new/old value

Mesaj gönderen gkimirti »

o zaman bu tarz istekler nasıl çözülüyor?
Çünkü bu tarz uygulama kullanma ihtimali yüksek, özel bir koşula göre ilk değer vermek icab edebilir,
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Triggerda new/old value

Mesaj gönderen sabanakman »

Varsayılan başlangıç değeri tablo tanımlanırken ayarlanabilen bir özelliktir, Trigger'a gerek yoktur. Mesela

Kod: Tümünü seç

ALTER TABLE dbo.tablo ADD CONSTRAINT
DF_tablo_alanadi DEFAULT 0 FOR alanadi
gibi bir sorgu ile bu işi halledebilirsiniz. Önerim, sql server yönetim aracı arayüzünde bazı incelemeler yapmak işe yarayabilir. Özellikle SQL Server'ın Enterprise Manager kullanışllı bir programdır. Tasarım, değişiklik gibi işlemler yaparken arayüzün sunduğu seçenekler çeşitli ipuçları verebilmektedir. Mesela sorunuza cevap ararken, bir tablo tasarladım ve yapılan tasarım değişikliklerini kayıt etmeden direk sql scripti olarak elde ettim. Enterprise Manager'ın en sevdiğim özelliği bize sunduğu bu özelliktir. Tabi kayıt edilmiş tasarımdan sonra boş bir sorgu gelecektir ama kayıt edilmemiş değişiklikleri direk sql kodu olarak vermektedir. Ayrıca sağ tıklama ile gelen Generate SQL Script seçeneği de çok işe yaramaktadır. Çünkü o sağ tıklanan nesneyi aynen oluşturacak kodları oluşturmaktadır. Eğer aradığınıza yine ulaşamadıysanız forumdan sorabilirsiniz, zira ben de aradığım bir çok soruya buradan cevaplar buldum :bravo: :bravo:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Re: Triggerda new/old value

Mesaj gönderen gkimirti »

aslında tablo tasarımında default deger atamadan haberim var fakat yapmak istediğim daha değişik bir şey.
örnek olması açısından bu şekilde söylemiştim.
Arabirim olarak DbWorkbench kullanıyorum, Enterprisemng den daha kullanışlı diyebilirim. Ama işime geldiği yerde onu kullandığımda oluyor.
o zaman yapmak istediğimi özetleyeyim:
ETASQLV8 den bir kayıt ekleme düzeltme yapılınca istediğim alanlar ile tüm tablo bilgileirini başka database içine aktarıyorum,
bir nevi senkronlama yapıyorum. eta databse inde aktaracagım tablolara bir trigger yazdım insert,updated yada delete işlemi olunca
aşağıdaki tablodaki satırı güncelliyor.

TABLENAME MODIFIED MODDATETIME
-----------------------------------------------------------------------
CARHAR 0 28.08.2008 16:30:57
CARKART 0 28.08.2008 16:30:58
FATFIS 1 28.08.2008 16:33:28
FATHAR 1 28.08.2008 16:30:57
IRSFIS 1 28.08.2008 16:30:58
IRSHAR 1 28.08.2008 16:30:37
STKHAR 1 28.08.2008 16:30:38
STKKART 1 28.08.2008 16:30:38

modified alanını bir kaç saniyede bir sorgulayarak ilgili tablodan aktarım yapıyorum.
buraya kadar problem yok (gerçi sonrasında da yok ekstra aktarım yapmak istemiyorum.)
ETA malesef CARHAR tablosunda bir kayıt işlenince CARKART tablosundaki bakiye vs. alanları güncelliyor ama bana lazım değil,
sadece cari bilgileri gerekli eğer bir değişiklik yapılmış ise.
haliyle bir fatura işlenince bir cari hareket oluşunca CARKART tablosuda gğncelleniyor

tüm bunları yazarken aklıma triggeri enable/disable etmek geldi
ve bu şeklide çözümü buldum sanki...
ALTER TABLE CARKART DISABLE TRIGGER CARKART_
....
ALTER TABLE CARKART ENABLE TRIGGER CARKART_

Fakat Firebird,Postgresql vb. veri tabanlarında ki triggerlarda new/old gibi değerlere erişebilirken MSSQL neden farklı bir
yoğurt yeyişi seçti onu anlamak mümkün değil.
İnanın Pos yada StrPos diye bilinen fonksiyonun karşılığını bulana kadar saatlerim gitti....
ÜŞENME,ERTELEME,VAZGEÇME
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Triggerda new/old value

Mesaj gönderen Hakan Can »

Hocam MS SQL'in çalışma şekli FireBird'den farklı. FireBird kayıt bazlı MS SQL multirow bazlı (ne demekse) çalışıyor.

Daha anlaşılır şekliyle söylemek gerekirse:

"UPDATE NET_MIKTAR SET OCAK = OCAK +1"

dediğinizde FireBird'de UPDATE trigger'ı her kayıt update edildikçe çalışır. MS SQL'de hepsi UPDATE edildikten sonra sadece bir sefer çalışır.

Bu yüzden MS SQL trigger'larında "inserted", "deleted" ve "updated" adında 3 tane tablo oluşur. Bunlar üzerinden istediklerinizi yapmaya çalışmalısınız.

Misal delete trigger'ında "INSERT INTO HEDEF_TABLO (KODU, ADI) SELECT KODU, ADI FROM deleted" gibi.

Bilhassa trigger açısından FireBird'den sonra MS SQL çok sıkıntılı. Ama temel işleyiş mantığına adapte olursanız ihtiyaçlarınızı elbette görecektir.

Kolay gelsin.
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Re: Triggerda new/old value

Mesaj gönderen Glen »

INSTEAD OF triggerini kullanin ancak orjinal Insert/Update/Delete 'i tek tek yapmak zorunda kalacaksiniz. Yada After Insert vb dedikten sonra Update yapin..
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Triggerda new/old value

Mesaj gönderen sabanakman »

Hakan Can yazdı:... MS SQL trigger'larında "inserted", "deleted" ve "updated" adında 3 tane tablo oluşur. ...
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla