FireBird Trigger & SP sorunu... !

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ı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

FireBird Trigger & SP sorunu... !

Mesaj gönderen hi_selamlar »

S.A. arkadaslar,

benim bir sorunum var?

iki tablom var. bunlar hesaplar ve girisler seklinde.
her sey güzel. triggerlar & sp leri yazdim.

neyse fazla uzatmim... :D

soyle bir sorunum var..
-----------------------------
hesaplar vt sinde update islemi oldugunda girisler vt sinde ki ayni hesap koduna ait olan kayitlari bularak yeni hesap koduna göre update etmesini istedim. bunun icin prtocedure yazdim (giris parametreli) daha sonra Trigger ile islemi yaptirdim. bu bölüm güzel calisiyor.
daha sonra deneme icin hesaplar vt sindeki bir kodu "001" iken "010" yapiyorum ve karsima soyle bi hata cikiyor..

Kod: Tümünü seç

Error Message:
-----------------------------------
Too many concurrent executions of the same request.
Too many concurrent executions of the same request.
At Trigger 'TR_Giris_topla_cikar_AIUD0'
bunu bir türlü cözemedim. butun islemlerimi procedure ile yapip trigger ile devreye sokuyom. ama hesaplar update trigger calisirken yukaridaki hatayi aliyorum.

Ne yapmam gerekli.. :(

sevgiler ve saygilar.
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

select in sonucunu aktarıyorsan birden fazla kayıt döndüğünden olabilir.. Daha net cevap için sorguyu tam yazmalısın.. :wink: Ayrıca tablolar foregein key şeklinde birbirine bağlı da olabilir :?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

abi select ile sadece kayit sayisini aliyorum.

Kod: Tümünü seç

select count(*) from gelir
where gelir.hesap_kodu=:hsp_kodu_eski
into kayit_sayisi;

daha sonra

Kod: Tümünü seç

if (kayit_sayisi>0) then
begin
 update gelir set
 gelir.hesap_kodu=:hsp_kodu, [i]{ gegisken}[/i]
 gelir.hesap_adi=:hsp_adi [i]{degisken[/i]}
 where gelir.hesap_kodu=:hsp_kodu_eski [i]{degisken}[/i]
end
seklinde kodu tamamliyorum.

trigger ise su sekilde calisiyor.

Kod: Tümünü seç

before update trigger position 1
begin
 execute procedure sp_hesap_plani_update(new.kodu,new.adi,old.kodu);
end
kod bu..

ama hesap listesi update isleminde girisler vt güncellendiginde hatayi veriyor.

hesap listesi degistiginde girislerdeki eski hesap kodlarinin yenisi ile degismesini istiyorum.

sevgiler ve saygilar..
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

Merhaba
Bunun için neden procedure kullanıyorsunuz. Trigger içinde olayı bitirseniz daha kolay olmaz mı?
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

S.A.

haklisin hocam trigger lar ile halledilebilir. ama kontrol altina almak icin sp kullaniyor ve trigger ile isi bitiriyorum.

fakat trigger lar ile de yapsam sanirim yukarida bahsettigim sorun devam edecek. neden ? :(

sevgi ve saygilarimla...
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

Anladığım kadarıyla soyle;
Hesaplar ve Girisler tablosu var
Hesaplar Tablosundaki kod alanı degistiginde bunun Girisler tablosundaki kod alanına yansımasını istiyorsunuz.

O zaman Hesap tablosunun update trigger ına sunu demeniz yeterli

Kod: Tümünü seç

if (new.hesap_kodu <> old.hesap_kodu) THEN 
/* mevcut değerin değişip değişmediğine bakıyoruz. */
 begin
   update girisler set hesap_kodu = new.hesap_kodu
     where hesap_kodu = old.hesap_kodu;
 end
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Mesaj gönderen hi_selamlar »

tesekkurler ....
bi denim bakim ne sonuc elde edecegim.. :)

peki ama bu hatayi neden veriyor...

Kod: Tümünü seç

Error Message: 
----------------------------------- 
Too many concurrent executions of the same request. 
Too many concurrent executions of the same request. 
At Trigger 'TR_Giris_topla_cikar_AIUD0'
sevgiler ve saygilar..
Herkes cahildir, bazi konularda.
onaydin

Mesaj gönderen onaydin »

Bu hatayı recursive-kendini çağıran bir durum olduğunda veriyormuş.
Mesela bir tablonun insert triger ına yine o tabloya insert ekleyen bir ifade yerleştirdiniz diyelim. Burda bir kayıt eklediğinizde trigger içindende bir kayıt eklenecek ve triggerdan eklendi diye trigger bi daha tetiklenecek ve sonsuz döngüye girecek bu nedenle böyle bir hatayı insert veya update olaylarında almak mümkün olabiliyormuş.

Bu hatayı ayrıca selectable procedure lerde bazı durumlarda veriyomuş ve fix edilmiş ama sizin sorununuzun bundan kaynaklandığını tahmin etmiyorum.

Kod: Tümünü seç

Problem:
Too Many Concurrent Execution of the Same Request error when
inserting or updating a table.

"Statement failed, SQLCODE = -693 
Too many concurrent executions of the same request"

Solution:
IB V4.x

This is caused by recursive triggers. Here is an example of a recursive
trigger that will return the  error message.

CREATE TRIGGER TGET_CUST_ID2 for TABLE1 
BEFORE INSERT 
AS 
BEGIN
   insert into table1(cust_id) values (5); 
   /* this is a recursive trigger where the same insert trigger is called 
   by itself and is creating an infinite loop*/
END!!

Re-evaluate the trigger to ensure there is no recursion.  Here 
is an example to fix the above example to eliminate recursion.

CREATE TRIGGER TGET_CUST_ID for TABLE1 
BEFORE INSERT
AS
BEGIN
   new.cust_id = 5;
END!!
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

aslinda bir veritabanı araci (Power Designer, Erwin ) kullaniyor olsaniz bu yapmak istediginiz referential integrity (yani veri butunlugunu koruma) cabanizi bu araclar zaten yapabilmekte.... Yani bu isler icin gerekli triggerlari hem de binlerce satir sizin unuttugnuz butun alternatifleri da kapsayan kodlari yazmaktalar.....

Bir de sahsi kanaatim bir takim blok isleri SP lere yikmak fikri guzel ben de oyle yaparim... Ama bu is buradaki gibi refferential integrity olursa o kadar cok SP niz olur ki.. Daha sonra raporlar ve bir takim diger isler icin yazacaginiz SP leri daha oncekiler icinde kaybedersiniz.....

Kolay gelsin......
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Cevapla