Firebird tárolt eljárás függőségei
2020-10-27T17:27:17+01:00
2020-10-28T09:53:34+01:00
2022-07-19T00:40:33+02:00
glakatos
Sziasztok!

A rendszerünkhöz Firebird 2.5-öt használok, amibe elég sok tárolt eljárás van, amik egymást is hívogatják.
Időnként azt tapasztalom, hogy ha olyan tárolt eljáráson módosítok(ALTER PROCEDURE), amit hív egy másik eljárás, akkor a hívó eljárás csak akkor veszi észre a módosult kódot, ha azt is újrafordítom, mert egészen addig a régi kódot hívja. Emiatt mindig úgy csinálom meg a módosító szkriptet, hogy a teljes függőségi fán levő eljárások is szerepelnek benne.
Most viszont egy olyan eljáráson kellene módosítanom, amit rengeteg másik eljárás használ, eléggé bonyolult a függőségi fája, ezért nem szerencsés a jelenlegi módszerem.
Most kipróbáltam teszt eljárásokon a függőséget, de ebben az esetben a függő eljárás azonnal észrevette a változást. Ez elbizonytalanított.
Mit javasoltok, hogy oldjam meg ezt a problémát?
Gábor
Mutasd a teljes hozzászólást!
Ez teljesen logikus, a tranzakciók elválasztása és a shadow page technika tükrében.
Ugye (default tranzakció elválasztásban) úgy oldja meg az elválasztást, hogy a rekordok változását egy új lapra írja és amíg egy régi tranzakció hivatkozik a régi lapra (rekordra) addig az él és neki az látszik. Mindenki más, az új tranzakciók, már az új lapot, így az új SP-t látják.

És ugye az rdbms tervezés alapelve az is, hogy a metaadatokat, így  SP-kat is ugyanúgy az adatbázisban kezeli adatként. Vagyis a SP-ból is két példány létezik, a nyitott tranzakcióknak a régi, az új tranzakcióknak az új.

/OFF
Visszacsatolva a másik topikra, a C mint kezdő programnyelv: na ugye hogy ugye.

Ha az alapelveket érti az ember, akkor olyan problémákra is "tudja" a megoldást (beugrik a megoldás összekombinálva a korábbi tudáselemeket) amiket soha nem tanult vagy nem kellett kikeresnie.
Mutasd a teljes hozzászólást!

  • Helló,

    Mit jelent számodra az, hogy "észrevette"?
    Amikor egy tárolt eljárást lefuttatsz, a firebird csinál hozzá egy binárist amit tárol is az rdb$procedures táblában, ott megtalálható maga a kódja is, de természetesen a binárist használja.
    A binárisokat, firebird váltásnál például kézzel kell újra fordítani.

    Szerintem a kulcs, hogy nálad vannak tranzakciók akik még a régi tárolt eljárást használják.
    https://firebird-support.yahoogroups.narkive.com/xiscylLj/do-i-need-to-recompile-a-stored-procedure

    However, I haven't close all connections to the database
    and maybe this is the reason?

    Yes, not closing all connections is the cause.
    Mutasd a teljes hozzászólást!
  • Ez teljesen logikus, a tranzakciók elválasztása és a shadow page technika tükrében.
    Ugye (default tranzakció elválasztásban) úgy oldja meg az elválasztást, hogy a rekordok változását egy új lapra írja és amíg egy régi tranzakció hivatkozik a régi lapra (rekordra) addig az él és neki az látszik. Mindenki más, az új tranzakciók, már az új lapot, így az új SP-t látják.

    És ugye az rdbms tervezés alapelve az is, hogy a metaadatokat, így  SP-kat is ugyanúgy az adatbázisban kezeli adatként. Vagyis a SP-ból is két példány létezik, a nyitott tranzakcióknak a régi, az új tranzakcióknak az új.

    /OFF
    Visszacsatolva a másik topikra, a C mint kezdő programnyelv: na ugye hogy ugye.

    Ha az alapelveket érti az ember, akkor olyan problémákra is "tudja" a megoldást (beugrik a megoldás összekombinálva a korábbi tudáselemeket) amiket soha nem tanult vagy nem kellett kikeresnie.
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a kimerítő választ. Tehát nekem elég a megváltozott eljárást kiraknom, éjszaka minden tranzakciót zár a rendszer, így másnapra biztos, hogy jó lesz.
    Mutasd a teljes hozzászólást!
abcd