Arama butonu
Bu konudaki kullanıcılar: 1 misafir
9
Cevap
827
Tıklama
0
Öne Çıkarma
SQL TRIGGER HAKKINDA SORU
C
12 yıl
Yarbay
Konu Sahibi

Arac, Musteri ve Araç kiralama adında 3 tablom var.

Stored procedure ile müşteri bilgilerini giriyor. Aracını seçiyor. Tarihleri seçiyor. Seçtiği bilgileri AraçKiralama tablosuna aktarıyor. Kiralanan aracın idini alabiliyorum ama musteri_id yi Arac kiralama tablosuna aktaramıyorum. Musteri id her girişte otomatik artıyor. Trigger ile aktarmayı denedim. Bu seferde Arac_id yi NULL döndürüyor hatası alıyorum. Halbuki araç id seçiliyor. İki tane procedur oluşturdum. Birisi müşteri bilgilerini diğeri de araç bilgilerini alıyor.

Nasıl bir çözüm bulmak gerekir ?

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi cllyldrm -- 29 Aralık 2013; 17:50:38 >

F
12 yıl
Yarbay

Aktarmak istedigin yerdeki alan aynı cinsdemi diger tablo ile.


Bu mesaja 1 cevap geldi.
F
12 yıl
Yarbay

Ekleme yapmak istedigin tabloda IDENT_CURRENT('ID is alınıcak tablo ismi')


Bu mesaja 1 cevap geldi.
C
12 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: fsh77

Ekleme yapmak istedigin tabloda IDENT_CURRENT('ID is alınıcak tablo ismi')

Evet alan cinsleri aynı. Tek bir prosedürde iki tane insert işlemi olur mu acaba . En sonki triggerda şöyle bir durum oluştu. Bu iki satır aynı yerde olması lazım ama farklı yerlere atıyor.

< Resime gitmek için tıklayın >

Müşteri bilgilerini aldığım prosedür
CREATE PROCEDURE MUSTERIBILGILERIAL 
@Musteri_isim varchar(50) ,
@Musteri_tel nchar(10) ,
@Musteri_email varchar(50) ,
@Musteri_ehliyet_id int ,
@Musteri_adres varchar(500) ,
@Musteri_soyisim varchar(100)
AS BEGIN
INSERT INTO Musteri(Musteri_isim, Musteri_tel, Musteri_email, Musteri_ehliyet_id, Musteri_adres, Musteri_soyisim) VALUES(@Musteri_isim, @Musteri_tel, @Musteri_email, @Musteri_ehliyet_id, @Musteri_adres, @Musteri_soyisim)
END


Kiralamabilgilerini aldığım prosedür.
CREATE PROCEDURE ARACBILGILERIAL 
@Arac_id int,
@Baslangic_tarihi date ,
@Bitis_tarihi date
AS BEGIN
INSERT INTO AracKiralama (Arac_id, Baslangic_tarihi, Bitis_tarihi) VALUES(@Arac_id,@Baslangic_tarihi, @Bitis_tarihi)
END


Trigger ım.
CREATE TRIGGER musteriidekle 
ON Musteri
AFTER INSERT, UPDATE
AS BEGIN
SET NOCOUNT ON
DECLARE @Musteri_id int
SELECT @Musteri_id = Musteri_id FROM INSERTED

INSERT INTO AracKiralama(Musteri_id) VALUES (@Musteri_id)
END


Bu mesaja 1 cevap geldi.
F
12 yıl
Yarbay

Trigger gerek yok, sen tablo ID si icin sadece verdigim fonksiyonu kullan kafi.


Bu mesaja 1 cevap geldi.
C
12 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: fsh77

Trigger gerek yok, sen tablo ID si icin sadece verdigim fonksiyonu kullan kafi.

Hata veriyor. Trigger kullanmadım ama kullandığım hatayı veriyor. ARACBILGILERIAL prosedürüne ekliyorum. Şu şekilde
SELECT IDENT_CURRENT('Musteri')

Cannot insert the value NULL into column 'Musteri_id', table 'RentaCar.dbo.AracKiralama'; column does not allow nulls. INSERT fails.
The statement has been terminated.

Hatası veriyor.

SELECT IDENT_CURRENT('Musteri') değerini döndürüyor ama Musteri_id kısmına insert etmiyor.


Bu mesaja 1 cevap geldi.
F
12 yıl
Yarbay

numeric(38,0) donus degeri budur o yuzden olabilir.Uygun donusumle yapabilirsin.Ayrıca tek proc kullan gerek yok iki taneye (iki insert tabiki yaparsın aynı proc icinde) triggersız dene yine.





< Bu mesaj bu kişi tarafından değiştirildi fsh77 -- 30 Aralık 2013; 17:01:40 >
Bu mesaja 1 cevap geldi.
C
12 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: fsh77

numeric(38,0) donus degeri budur o yuzden olabilir.Uygun donusumle yapabilirsin.Ayrıca tek proc kullan gerek yok iki taneye (iki insert tabiki yaparsın aynı proc icinde) triggersız dene yine.

Şu şekil çözdüm. Teşekkür ederim yardımlarınız için. scope_identy kullanımını anlamış oldum.
CREATE PROCEDURE [dbo].[KIRALAMABILGILERIAL] 
@Musteri_isim varchar(50) ,
@Musteri_tel nchar(10) ,
@Musteri_email varchar(50) ,
@Musteri_ehliyet_id int ,
@Musteri_adres varchar(500) ,
@Musteri_soyisim varchar(100),
@Arac_id int,
@Baslangic_tarihi date ,
@Bitis_tarihi date
AS BEGIN
DECLARE @ID int
INSERT INTO Musteri(Musteri_isim, Musteri_tel, Musteri_email, Musteri_ehliyet_id, Musteri_adres, Musteri_soyisim) VALUES(@Musteri_isim, @Musteri_tel, @Musteri_email, @Musteri_ehliyet_id, @Musteri_adres, @Musteri_soyisim)
SELECT @ID = SCOPE_IDENTITY()

INSERT INTO AracKiralama (Arac_id, Baslangic_tarihi, Bitis_tarihi, Musteri_id) VALUES(@Arac_id,@Baslangic_tarihi, @Bitis_tarihi, @ID)
END





< Bu mesaj bu kişi tarafından değiştirildi cllyldrm -- 30 Aralık 2013; 17:59:05 >
Bu mesaja 1 cevap geldi.
F
12 yıl
Yarbay

C
12 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: fsh77

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table.

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

Bir bakayım.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.