firebird

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

firebird

Mesaj gönderen vedatkaba »

Arkadaşları herkese kolay gelsin..

Master tablo
----------------
M_ID İNTEGER NOT NULL (primarykey)
M_AD AD


Detail Tablo
-----------------
D_ID1 INTEGER NOT NULL (primarykey)
D_ID2 INTEGER NOT NULL (foringkey)
D_BILGI STRİNG

bu şekilde iki tablomuz var olsa..
bu iki tabloyu M_ID-->D_ID2 ile ilişkilerdiriyorum..
birleştirme için Bileşen Olarak IBTable kullandım..detail tablonun IndexFıeldname=D_ID2, Master Fields=M_ID oarak ayarladığım zaman herşey normal çalışıyor. İkitabloyu bu şekilde birleştirmemdeki amaç detail tabloya 1 den fazla kayıt gireceğimi düşünerek yaptım.bu şekilde master tabloya bir kayıt giriyorum daha sonra master talboda datasoruce hangi kayda konumlu ise o kayıtın M_ID numarası otomatik olarak D_ID2 ye atıyor.ve kaydı giriyorum sorunsuz yine aynı kayıta konumlu iken birdaha girmek istediğimi yine M_ID yi atıyor, uniqe olmadığı için aynı numara atanabiliyor.

Ama master talodan kayıt silersem detail silinmiyor,bir tabloda primerykey tanımlamadan foringkey tanıtamazmıyız böyle bir şart mı var ben tanıtamadım.IBTable ın index def ten foringkeyi indexfieldname de gösteremiyorum.
hata sizce neresi,, bu şekilde bir yapı yanlışmı doğrumu,veya bu şekilde bir olayı nasıl yaparız.endindiğim bilgiler doğrultusunda birşeyler yapmaya çalıştım ama olmadı nedense.evet arkadaşlar sizlerden ricam bana fikirlerini sunmanız çözüm önerilerinizi bekliyorum.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Master kayıt silindiğinde detay daki kayıtların silinmesini bekleyemezsiniz.
Bunun için en iyisi master ın After Delete Trigger ına gerekli kodu yazmaktır.

Kod: Tümünü seç

CREATE TRIGGER TD_ Master_tablo  FOR  Master_tablo 
ACTIVE AFTER DELETE POSITION 0
as
declare variable KAYIT_SAYISI  integer;
begin
    select count(*)
    from   Detail_Tablo
    where  D_ID2 = old.D_ID2
    into   :KAYIT_SAYISI;

    if (KAYIT_SAYISI > 0) then
    begin
       delete from Detail_Tablo
       where D_ID2 = old.D_ID2;
    end
end
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Master'dan kayıt silindiğinde foreign key ile bağlı detay tablodan da master'a ait kayıtların Server tarafından otomatik silinmesi için Foreign Key'in OnDelete 'ini CASCADE yapmanız gerekir.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

@coderlord'un dediği gibi foreing keyi tanımlarken bu özelliğin firebird tarafından otomatik olarak yerine getirilmesini sağlayabilirsin.

benim eklemek istediğim husus bu konuda çok dikkatli olmandır. Veritabanının yapısına göre zincirleme oluşacak bir silme işlemi istenmeyen kayıtlarında silinmesine neden olabilir.

dikkatli olmakta fayda var.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Tabiki öle dikkatli olmak lazım...Detaildeki foringkey tanımlarken ayarlamaları yapıyorum ama yine silmedi o yüzden foruma sormuştum..Oğuz hocam trigger vermiş onla deniycem inşallah olur..İlgilendiğiniz için teşekkür ederim ...firebird öğreniyoruz kolay olmuyor tabiki ama baya iyiymiş bu firebird.

Ben yine sık sık rahatsız edicem..Kolay gelsin..
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Cevapla