| dolphin | 05.08.2003 - 16:53:52 |
| Selam arkadaslar,
Sql server da insert trigeri icersinde insert edilen bir tablonun fieldini nasil set edebilirim. Yani mesela insert into Table1 field1, field2 values ('a', 'b') gibi bir sql cumlesi calistiginda ben trigger icersinde filed3 = 'c' yapmak istiyorum. | |
| fahrettin | 05.08.2003 - 22:40:05 |
update tablo1 set field3='c' where ....... tabi sadece ilgili kaydi update edebilmek icin where kismina primary key alan veya alanlarini ve insert edilen degerlerini yazmalisiniz. Tabi insert trigger'inin after insert olarak calismasi gerekiyor. | |
| dolphin | 06.08.2003 - 08:44:22 |
| Evet ama burda onemli olan insert edilen kaydin field ini trigger icinden set edebilmek. Yani where kismini nasil yazabilecegim lazim banada. Bu arada sunu soylemeyi unuttum tabloda identity olan unique bir field var. Where kismina IDENT_CURRENT ile son id yi alip yazmak problem cikarirmi acaba? | |
| mussimsek | 06.08.2003 - 09:08:55 |
| Merhaba,
problem çıkarmaması lazım. Ben daha önce bu şekilde bir stored proc yazmıştım ama şu an yanımda yok. Eğer deneme şansın varsa, bir dene. Kolay gelsin. | |
| asavas | 06.08.2003 - 09:14:00 |
| yanlış hatırlamaıyorsam SQL Server içinde insert ve delete işlemleri için INSERTED ve DELETED diye iki geçici tablo var. Yeni bir kayıt yaparken trigger içinde INSERTED.Field3 = sdfsd yazarsan istediğini yapabilirsin.
kolay gelsin | |
| fahrettin | 06.08.2003 - 11:00:32 |
| MSSQL kullanmadigim icin bilmiyorum fakat Sybase triggerlerinde silinen veya update'den onceki degerleri verdiginiz bir alias ile kullanabiliyorsunuz. (referencing old as oldrows) Yeni eklenen kayitlari da "referencing new as newrows" seklinde trigger basinda tanimlayip newrows.field3 seklidne kullanabiliyorsunuz.
MSSQL'de de bu vardir. asavas'in dedigi INSERTED ve DELETED o anlamda olabilir. Ornek herhangi bir trigger'da gorebilirsiniz bunu zaten. Maksimum kaydi alip kullanmak makul gibi gorunmekle birlikte ileride boyle bir kod yazdiginizi unutup tablonuza ilgili alan degeri maksimum olan degil de arada bir degere sahip kayit eklediginizde sistem calismayacaktir. Dolayisiyla boyle birsey yapmamaniz gerektigini surekli hatirlamaniz lazim. Velhasil bence o sekilde yapmamali. Kolay gelsin.. | |
| denaris | 06.08.2003 - 11:59:43 |
| SQL Server Hiç Kullanmadım Ama Oracle 'da Trigger Yazımında :27dd38277c kısmında :27dd38277c alanlarına gerekli değerleri koyduğunda (OLD ve NEW olsun) :NEW.field3 = 'c' diyebiliyoruz. SQL Server bunu nasıl yapıyor pek bilmiyorum. Kolay gelsin | |
| Kuri_YJ | 06.08.2003 - 17:20:55 |
| Merhaba,
Insert işleminde Trigger gerçekleşirken Trigger Zamanlaması da önem taşıyor. Interbase'de Before Insert, After Insert gibi Kaydın öncesinde mi yoksa sonrasında mı şeklinde bir ayrım var. SQL Server'da da bu var. Eğer After pozisyonunda ise (ki default'u budur) update'ini, UPDATE TABLO1 SET FIELD3='c' WHERE (SELECT Tablo1dekiIdentityOlanField FROM INSERTED) = Tablo1dekiIdentityOlanField Ancak dikkat edilmesi gerweken bir şey eğer insert işlemi toplu bir inser ise bu şekilde olmaz, bu sadece aynı anda sadece bir kayıot yaparken kullanabilirsin. Kolay Gelsin Kuri TLJ | |
| fahrettin | 07.08.2003 - 08:40:15 |
Ancak dikkat edilmesi gerweken bir şey eğer insert işlemi toplu bir inser ise bu şekilde olmaz, bu sadece aynı anda sadece bir kayıot yaparken kullanabilirsin. Kuri TLJ Evet yeri gelmisken bu konu ile ilgili sunu belirteyim. Kuri_TLJ Bey'in de belirttigi gibi MS SQL Server statement level trigger calistirir dolayisiyla toplu insert ve update islemleri icin farkli yollar izlemeyi gerektirir. Kendim kullandigim icin bildigim Sybase ve Interbase ise row level trigger calistirir ve dolayisiyla toplu olarak yapilan her insert , update veya delete islemi sirasinda her satir icin triggerlar ayri ayri calistirirlirlar. Kolay gelsin... | |