Sql Server Trigger
Sql Server Trigger
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...
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...
firebird syntax ı
Kod: Tümünü seç
if (new.FORM_NO is null)
then new.FORM_NO = 'deger'
;
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
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
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.
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,
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
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)
------------------------
"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)
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...
ö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...
Selamlar,
ID dediğiniz alan Identity bir field değil mi?
ID dediğiniz alan Identity bir field değil mi?
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
Re: Sql Server Trigger
Selam,
"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,
Sanırım bir kavram sorunu yaşıyorsunuz. Söylediklerinizden iki çıkarım yapmak istiyorum;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().
"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)
------------------------
"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)
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.
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.
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
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,
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)
------------------------
"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)