firebird de primary key ve trigger beraber çalışmıyor...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kadioglu
Üye
Mesajlar: 34
Kayıt: 22 Mar 2004 06:15

firebird de primary key ve trigger beraber çalışmıyor...

Mesaj gönderen kadioglu »

merhbalar;

şöyle bir sorunum var
firebird maestro programında veri tabanı tasarımı yapıyorum ,
primary key olarak bir alanı tanımlıyorum ..
ve alana bir triggir yazdım (artan sayı için)...
her şey normal buraya kadar....

ama bilgi girmeye çalıştığımda (delphiden ya da maestrop programından)
bu alan boş geçilemez diye hata veriyor..
(triggerları defalarca denedim kontrol ettim doğru)..
eğer alanı primary key yapmazsam otomatik sayı düzgün çalışıyor..
sizce sorun ne olabilir..
ilgilenenlere tşkler...
...ROKA...
kadioglu
Üye
Mesajlar: 34
Kayıt: 22 Mar 2004 06:15

Mesaj gönderen kadioglu »

sql metni aşağıdadır....


CREATE TABLE TABLE01 (
ALAN1 INTEGER NOT NULL,
ALANMETIN VARCHAR(20) CHARACTER SET WIN1254,
/* Keys */
CONSTRAINT PK_TABLE01
PRIMARY KEY (ALAN1)
);


SET TERM ^ ;

CREATE TRIGGER TRIGGER01 FOR TABLE01
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.ALAN1 is null) then
BEGIN
NEW.ALAN1 = GEN_ID(ALAN1,1);
END

END^

SET TERM ; ^

GRANT DELETE
ON TABLE TABLE01
TO TRIGGER TRIGGER01;

GRANT DELETE
ON TABLE TABLE01
TO PUBLIC;
...ROKA...
kadioglu
Üye
Mesajlar: 34
Kayıt: 22 Mar 2004 06:15

Mesaj gönderen kadioglu »

merhabalar öncelikle şunu söyleyeyim, bu konuyu forumda çok araştırdım
ve konuyla yakından ilgilileri dahi okudum,
buna rağmen çözüm bulamamıştım,
bende ibexpert (hala ücretsiz olanını bulamadım)
ile veri tabanı yaptım.
ve veri tabanına ibquery ile bağlanıp kayıt yaptım..
şuan otomatik sayı çalışıyor..
ama ibtable ile çalışmıyor....

firebird 2.01 kullanıyorum...
...ROKA...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
ib table ile çalışmamasının sebebi büyük ihtimalle alanın gerekli özelliğinin true olması. field editörden required alanını false yapın
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

ib table da trigerlar otomatik çalışmaz
trigerların çalışması için insert ve update olaylarını sql kodu kullanarak ibquery ile yapman lazım.

eğer o trigeri kullamak şistiyorrsan
triger'a yazdığı o kodu stored procedure yapman lazım.
bunu nasıl kullanacağın hakkında bilgi forumda (:ara stored procedure )mevcut. kolay gelsin
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Lost Soul yazdı:ib table da trigerlar otomatik çalışmaz
eminmisin?
ibtable kullanmıyorum ama trigerların bileşene göre davranacağını hiç zannetmiyorum.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

aslangeri yazdı:
Lost Soul yazdı:ib table da trigerlar otomatik çalışmaz
eminmisin?
ibtable kullanmıyorum ama trigerların bileşene göre davranacağını hiç zannetmiyorum.
fibplus dan çnce ib kullanıyordum.
ibtable trigerları tetiklemiyor. onun yerine stored procedure ye kaydedip IBStoredProc ile çağırman gerekiyor.

ama FIBPlus kullanıyorsan. doğrudan sql kodları ile çalıştığı için database eventlarındaki trigerlar ototmatikmen teitkleniyor.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Merhaba.

Aynı sorunla karşılaşmıştım.

İlk denediğim şey, ID alanlarının "not null" özelliğini kaldırmak oldu. VT oluşturulurken kabul etmese de, sonradan edit edilebiliyordu. Fakat sonra bir sıkıntı çıktı, InnoSetup ile kurulum hazırlanırken kafası karışıyor ve şu hatayı veriyordu: "ID hem primary key, hem not null değil : s" Yani setup programında VT dosyasını kopyalayacaksanız, SQL ile oluşturmayacaksanız bu yöntemi deneyebilirsiniz.

Tam çözüm ise şu: TIBDataSet kullanın ve Object Inspector'de GeneratorField'ı şu şekilde ayarlayın:
Generator: Generator Adı
Field: PrimaryKey Adı
Increament By: 1
ApplyEvent: OnPost

Yanılıyorsam düzeltin, ama sanırım not null alanlar trigger tetiklenmeden kontrol ediliyor ve bu nedenle hata veriyor.

IBExpert'i indirmek için önce kaydolmanız gerekiyor ve ücretsiz olarak Tool'lardan IBExpert ve IBExpert Live'ı kullanabiliyorsunuz.
Kayıt linki

(Apply Event seçenekleri:
-OnNewRecord: Append/Insert komutu verdiğiniz anda ID oluşturulur, yani sonradan Cancel deseniz de Generator artar
-OnPost: Post komutu verdiğinizde ID oluşturulur ki bu yüzden seçiyoruz
-OnServer: Bunu hatırlamıyorum ya da hiç bilmedim : ))
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Lost Soul yazdı:ibtable trigerları tetiklemiyor
arkadaşım yanlışın var
şimdi bir gdb oluşturup denedim. ibtable bileşeni ile autoinc alana trigerdan değer attım triger çalıştı. tabloyu refresh yaptığım zaman trigger autoinc alana değer atmış.
Sanırım başka bir sorundan dolayı trigerların çalışmadığı hükmüne varıyorsunuz. ama trigerların bileşen seçmesini ihtimali :roll:
ibtable sa çalışmam queryse çalışırım :roll:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

kadioglu yazdı:....
bende ibexpert (hala ücretsiz olanını bulamadım)...
http://www.dalgayazilim.com download sayfasına girerseniz orda ibexpertin ücretsiz sürümünü bulabilirsiniz. :wink:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
kadioglu
Üye
Mesajlar: 34
Kayıt: 22 Mar 2004 06:15

Mesaj gönderen kadioglu »

arkadaşlar cevaplarını< için çok teşekkür ederim..

1. firebird maestro programını bıraktım (kendi içinde dahi olması gerekn işlemleri yapamadı)
2. ibexpert e geçtim kesnilşikle çok güzel bir araç
3. ibdataset kullandım.. hem sql rahatlığı hemde table kolaylıklarını barındırıyor..
4. otomatik sayıyı da

Tam çözüm ise şu: TIBDataSet kullanın ve Object Inspector'de GeneratorField'ı şu şekilde ayarlayın:
Generator: Generator Adı
Field: PrimaryKey Adı
Increament By: 1
on new record


ile hallettim....
iyi çalışmalar
...ROKA...
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

aslangeri yazdı:
Lost Soul yazdı:ibtable trigerları tetiklemiyor
arkadaşım yanlışın var
şimdi bir gdb oluşturup denedim. ibtable bileşeni ile autoinc alana
ibdataset olmasın o :)

kullandığım dil delphi7 enterprise bileşenler delphi ile gelen interbase bileşenleri.
ibtable trigerları tetiklemiyor. defalarca problem yaşadım çünkü triger konusunda ibtable da.
bu sebeple ibtable kullandığım yererde stroed procedure oluşturup ibstoreproc bileşeni ile ibtable.beforepost olayından çağırıyordum counterları.

fibplus kullanıyorum şimdi. commitler de dahil olmak üzere bir çok işi kendisi hallediyor. :D


@kadioglu probleminin çözülmesine sevindim. iyi çalışmalar.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

:)
kullandığım bileşen ibtable.
delphi6 kullandım. ib bileşenleri ve fb 1.5.

defalarca yaşadığınız problem eğer autoinc alanlarla ilgili ise emin olun trigerlar çalışıyor. ancak ibtable in autoinc alana verdiği değeri görmeniz için tabloyu kapatıp açmanız lazım. çünkü id alanına değer triger ile veriyorsunuz. ibtable ın bunu görmesi için datayı yeniden çekmesi lazım.
şöyle düşünün siz tabloda bir alana manuel 'ahmet' yazdınız. sonra before insert trigerinda 'ahmet' i 'mehmet' yaptınız. hangi bileşeni kullanırsanız kullanın o alan tabloyu refresh yapmadığınız müddetçe ekranda ahmet olarak görüncektir. şimdi triger çalışmıyor diyebilirmiyiz. tabloyu refresh yaptığımız zaman kayıtlar mehmet olarak görüncektir. e hani triger çalışmıyordu?

tekrar söylüyorum trigerin bileşen seçmesi mümkünmü?
ibtable sa çalışmam ibdataset se çalışırım demesi mümkünmü?

evet ibtable kullanarak autoinc alana verilen değeri görememiş olabilirsiniz ama ibtable larda triger tetiklenmiyor dediğiniz zaman olmaz.
ibdataset kullandığınız zaman generator fieldi ayarlamadan aotuinc alana değer alabiliyormusunuz? autoinc alana değeri almak için ekstra işlemler yapıyorsun ibdataset kullandığın zaman autoinc alana değeri triger mi veriyor yokda genartor field dan yaptığın ayarlamalar ile ibdataset kendisi mi alıyor. o zaman ibdatasettede triger çalışmıyor?
......................
neyse biraz uzun oldu sanırım ama umarım anlatabilmişimdir.
iyi günler.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

@aslangeri ye aynen katılıyorum. Veri bütünlüğü ve tutarlılık (Referential Integrity) adına trigger/autoinc yöntemi kullanılmak istense de master/detay uygulamalarda delphi tarafın bundan haberi olması için farklı yöntemler (mesela afterinsert te başka bir transection ile triggerin artırdığı primary key e atanan generator okutulabilir) kullanmak gerekir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla