Sql Server Trigger

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
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Sql Server Trigger

Mesaj gönderen hicker »

bir insert triggeri içerisinde kaydedilmekte olan satirin herhangi bir kolon degerini degistirerek kayit islemini nasil yaptirabilirim?
tam olarak yapmak istedigim; null kabul etmedigim bir alana null eklenmek istendiginde default olarak bir fonksiyon calistirilarak sonuc degerini kaydettirmek.
tablo taniminda mesela tarih alaninin tipi datetime ve default degeri getdate(). kullanici tarih girmese de getdate ile o anki tarih kaydediliyor. kendi fonksiyonumu default olarak tanimlayamadim. aklima trigger geldi. kayit eklenip null kabul edilmiyor hatasi olusmadan eklenecek kaydin o kolonlarina kendi degerlerimi nasil atayabilirim?
simdiden tesekkurler...
onaydin

Mesaj gönderen onaydin »

firebird syntax ı

Kod: Tümünü seç

 
 if (new.FORM_NO is null)
  then new.FORM_NO = 'deger'
;
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

ayni sekilde "new" olarak kullanip degerini degistirebilecegim bir degisken sql server'da da var mi?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

MS-SQLServer'da öyle bir şey yok (????) Onun yerine INSERTED diye bir şey var ama onun kullanımı FB/IB veya diğer DB'lerdeki gibi değil.
Sadece bakabiliyorsun orada Insert veya Update edilen kayıtlara.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

yardimlariniz icin tesekkur ederim. hey microsoft... ne buyuksun sen ya!
onaydin

Mesaj gönderen onaydin »

Bu şekilde olmayabilir ama onlarda başka bir şekilde değiştiriyorlardır belki.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

MS SQL server 2000 ve üzerinde bunu yapabilirsiniz. Şöyleki "INSTEAD OF" triggerları bu işi gayet güzel görüyorlar. Mekanizma nasıl çalışıyor ?

Eğer tablonun INSTEAD OF trigger ı yoksa işlem otomatik tamamlanıyor (insert ise kayıt ekleniyor, delete ise siliniyor vs). Eğer var ise instead of trigger ı içinde asıl tabloya inserted yada deleted temp tablolarından siz kendiniz aktarabiliyorsunuz. Bu durumda istediğiniz gibi değiştirebilirsiniz. Örneğin;

Elimizde bir tablo var adi ve soyadi kolonlari olan. Biz adi gelmese de gelse de hep adi kolonuna ISO yazmak isteyelim.

Kod: Tümünü seç

CREATE TRIGGER insteadoftest ON deneme 
INSTEAD OF INSERT
AS
    INSERT INTO deneme SELECT 'ISO',soyadi FROM inserted
END
GO
Hepsi bu kadar.. Eski sürümlerini bilmiyorum ama MS SQLserver 2k da bu şekilde çalışıyor. Tabii ihtiyaca gore T-SQL i kullanarak çok değişik işlemler de yapılabilir. Ben basit olsun diye bu örneği verdim.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

hocam oncelikle aciklamanizin netligi icin tesekkur ederim.instead of triggeri ile yapmayi denedim ama istegimi karsilayamadi malesef.
örnek tablo;
ID: float not null
AD: char(50)

insert into tablo (id,ad) values(1,'ali') seklinde insert komutu geldiginde instead of triggerinden id degerini goz ardi ederek yeni degerini verebiliyorum. ama:
insert into tablo (ad) values('ali') seklinde bir insert komutunda trigger tetiklenmeden direkt olarak null kabul edilmedigi hatasi vererek islem sonlaniyor. veya var olan bir id degeri ile insert yapmaya kalktigimda constraint hatasi veriyor. yani oncelikle insert komutunun tabloya uyup uymadigina bakarak uydugu takdirde trigger tetikleniyor. benim istedigim oncelikle triggerin calisarak id degerini fonksiyondan almasi. bunu instead of ile yapmak mumkun mu? veya baska bi sekilde...
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

ID dediğiniz alan Identity bir field değil mi?
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

hayir. identity degil.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Re: Sql Server Trigger

Mesaj gönderen doganzorlu »

Selam,
hicker yazdı:null kabul etmedigim bir alana null eklenmek istendiginde default olarak bir fonksiyon calistirilarak sonuc degerini kaydettirmek.
tablo taniminda mesela tarih alaninin tipi datetime ve default degeri getdate().
Sanırım bir kavram sorunu yaşıyorsunuz. Söylediklerinizden iki çıkarım yapmak istiyorum;

"Null girişe izin vermediğim bir kolona eğer null değer gelmişse bunu bir değerle değiştirmek istiyorum"

"Eğer alana null değer gelmişse bunu bir değerle değiştirmek istiyorum"

Şayet alana null değer geldiğinde herhalükarda kaydı yapacaksanız (kendi atayacağınız değerle) neden alanı null geçilemez yapıyorsunuz ? Bunu anlamakta güçlük çekiyorum..

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

bunun sebebi aslinda sql server üzerindeki tecrübesizligim diyebiliriz. bunu yapmak istememin sebebine gelince.. tum tablolar icin import modulu yazmak yerine sql manager'in import wizardinin kullanimini saglamak. tablolarima veri girisini programdan sorunsuz bir sekilde yaptiriyorum. kullanici baska bir kaynaktan import islemi yapmak istediginde bunu direkt olarak tabloya degil de import icin olusturacagim view uzerine yapmasini istiyorum. boylece primary key alanlarima uygun degerleri tek bir trigger ile yerlestirmek istiyorum. neden identity bir alan kullanmadigima gelince... aslinda id alanlarim auto increment degerler aliyor. ama bazi durumlarda o id'ye ait kaydin bir kopyasini negatif olarak insert ediyorum. bunu identity sahada yapmak icin ekstra islemler gerekiyor. oracle'daki sequence mantigini sql serverda olmadigi icin (veya ben bulamadigim icin) kendim olusturmaya calistim.
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

bi soru daha.. sql server import wizard sanirim trigger tetiklemeden islem gerceklestiriyor. bunu triggerlar uzerinden yapmak icin import wizarddan herhangi bi ayari mi degistirmeliyim? yoksa nested triggers'i aktif mi yapmaliyim?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Bir bilgi vermek istiyorum. MS-SQL Server'da bulk işlemlerde (toplu insert veya toplu update veya toplu delete) yaparken triggerlar sadece 1 kere tetiklenir :)

Bu sebeple sizin bu tarz işlemlerde CURSOR açıp döngü kurmanız gerekmekte. Bir insert trigger'ı, toplu INSERT işlemi sırasında sadece 1 kere tetikleniyor.

Bu arada DTS'de ayar vardı triggerları enable/disable et diye. Başka bir şey mi kullanıyorsunuz?

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Hangi tip bir datayı transfer ettiğinizi bilmediğimden mevcut bir den verilerin import edildiğini varsayarak şöyle bir yaklaşımda bulunacağım. DTS, yani Data Transformation Services çalıştığında triggerlar çalışmazlar. Bunun nedeni ise bulk load yapılırken performansın sağlanması ve bulk load edilecek bilginin sadece data değil aynı zamanda tüm database bileşenleri olabileceğidir. Bu anlamda transfer edilen datanın kendi içinde ri yapısının mevcut ve sağlıklı olduğu kabul edilir. Eğer triggerlar çalışsalardı bir db den yeni bir tane oluşturmak için bunu kullandığınızda süreç oldukça uzun olacaktı. Bu nedenle DTS ile schema ve objeleri transfer edip, Delphi datapump ile de dataları aktarmayı deneyebilirsiniz.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Cevapla