Arama butonu
Bu konudaki kullanıcılar: 1 misafir
9
Cevap
828
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 ?





< 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.