Databáze > Firebird a Interbase
Získanie práve vytvoreného ID
Stanislav Hruška:
ID = hodnota pre Primary key
Čo riešim
Vytvorím nový záznam - je už v tabuľke. Aktualizujem si VT - hodnotami z formulára, ale tam nemám ID. Tým pádom pri pohybe vo VT mi nenájde patričný záznam (TIBDataset.Locate('ID', ...)). Ako správne získať hodnotu ID? Predpokladám konkurečný prístup k tabuľke.
Čo som sa dočítal
1) Použiť uloženú procedúru a ziskané ID použiť pre primárny kľúč (to sa môže vykonať priamo v SP) a iné účely. Veľmi to neodporúčajú (Císař). ID by sa malo priraďovať pomocou spúšte.
2) Využiť jednoriadkovú systémovú DB. Vytvoriť si tam jeden záznam s ID a vyzdvihnúť si jeho hodnotu na ďalšie použitie. To mi pripadá dosť komplikované.
Podľa toho čo som čítal, tak predpokladám, že TIBDataset po vytvorení záznamu znova načíta všetky údaje. Tam by sa teorteicky dala zistiť hodnota ID podľa najvyššej hodnoty. Ale je to 100 %? Nezdá sa mi to ako pravé orechové.
Jedná sa o vkladanie jednotlivých záznamov na klientovi. Užívateľ musí minimálne stlačiť tlačidlo "Ulož".
Ako sa to správne robí?
Mi.Chal.:
měl bys mít někde nějakou logiku, která založí nový záznam a vrátí jeho id. Třeba tak, že si to napíšeš jako SP a ta to id vrátí. Jestli na FB jde nějak nastavit hodnotu v triggeru a vrátit jí v rámci insertu nevím, moc bych tomu ale nevěřil. Jestli tu hodnotu id bude plnit insert nebo si ji vygeneruješ generátorem a použiješ pro vložení insertu je podle mě jedno, pokud máš zaručeno, že ten generátor nebude vracet dvakrát po sobě stejnou hodnotu. Po vložení záznamu si prostě refreshni grid a id záznamu budeš vědět.
2) je blbost, protože to nebude fungovat ve víceuživatelském prostředí. Můžeš dostat tabulku s x záznamy a nevíš, co si vložil ty a co někdo jiný.
pepak:
--- Citace: Mi.Chal. 25-10-2012, 09:33:11 ---Jestli na FB jde nějak nastavit hodnotu v triggeru a vrátit jí v rámci insertu nevím, moc bych tomu ale nevěřil.
--- Konce citace ---
Zničte nevěřící! :-)
INSERT INTO ... RETURNING ...
--- Citace ---pokud máš zaručeno, že ten generátor nebude vracet dvakrát po sobě stejnou hodnotu.
--- Konce citace ---
To je u SQL generátorů zaručeno.
Na získání ID předem není nic špatného. Doporučení nebo nedoporučení je spíš věcí zvyklostí autora nebo jím používaného frameworku než nějakých objektivních faktů.
--- Citace ---2) je blbost, protože to nebude fungovat ve víceuživatelském prostředí. Můžeš dostat tabulku s x záznamy a nevíš, co si vložil ty a co někdo jiný.
--- Konce citace ---
Plus je blbost pracně emulovat funkci generátorů, které jsou právě pro tohle určené...
Stanislav Hruška:
// INSERT INTO ... RETURNING ...
Za momentálenj siutácie nemôžem použiť. ID zapisujem pomocou generátora v trigger-te v onBeforeInsert. V Insert nemôžem menovať ID, nakoľko musí mať hodnotu null. Viď podmienka v trigger-te if (new.id is null) then.
2)
//je blbost, protože to nebude fungovat ve víceuživatelském prostředí. Můžeš dostat tabulku s x záznamy a nevíš, co si vložil ty a co někdo jiný.
Asi ti ušlo, že to je jednoriadková tabuľka - vždy! A slúži na podobné účely. Vložíš a okamžite získaš hodnotu. Či tam niekto stačí vložiť nový záznam neviem
// Plus je blbost pracně emulovat funkci generátorů, které jsou právě pro tohle určené...
Vkladá sa to práve pomocou generátora. Slúži to len na získanie práve vygenerovanej hodnoty.
Takže pravdepodobne mám použiť postup
Vytvorím SP, ktorá vygeneruje ID. Spustím ju v trigger-te. Tam hodnotu ID priamo použijem a pomocou SP si ju pošlem na klienta.
Hm, ale keď SP automaticky spustím v trigger-te, ako sa dostanem k návratovej hodnote? To by som vedel pomocou TIBStoredprocedure. Čosi nesedí :-\
pf1957:
--- Citace: Stanislav Hruška 25-10-2012, 10:23:06 ---// INSERT INTO ... RETURNING ...
Za momentálenj siutácie nemôžem použiť. ID zapisujem pomocou generátora v trigger-te v onBeforeInsert. V Insert nemôžem menovať ID, nakoľko musí mať hodnotu null. Viď podmienka v trigger-te if (new.id is null) then.
--- Konce citace ---
Ja to teda nezkousel, protoze nove zaznamy vkladame temer vyhradne pres SP mimo operace s datasetem, ale zkousel jsi .... RETURNING :ID?
U nekterych DB s autoinkrementem jsou platna ID > 0, takze v duchu stejne logiky muzes rict, ze ID=0 ma stejny vyznam jako NULL a pak v tom triggeru muzes testova (new.id is null or new.id=0). Tim by ti mohlo upadnout rada problemu s datasetem.
--- Citace: Stanislav Hruška 25-10-2012, 10:23:06 ---Vytvorím SP, ktorá vygeneruje ID. Spustím ju v trigger-te. Tam hodnotu ID priamo použijem a pomocou SP si ju pošlem na klienta.
Hm, ale keď SP automaticky spustím v trigger-te, ako sa dostanem k návratovej hodnote? To by som vedel pomocou TIBStoredprocedure. Čosi nesedí :-\
--- Konce citace ---
Ta SP se vetsinou dela na vlozeni zaznamu a vraci nove ID. A v te SP si ID bud vygenerujes dopredu pomoci gen_id a priradis hodnotu do ID a vratis ji z te SP, nebo to nechas na triggeru, u insertu pouzijes to returning :ID a vratis ho z SP.
A nebo zadnou SP delat nebudes a gen_id si spustis na strane klienta normalnim selectem.
Jak psal Pepak, v zasade je to jedno, pro co se rozhodnes, ale v tom konkretnim projektu to pak delej vsude stejne.
Navigace
[0] Seznam témat
[#] Další strana
Přejít na plnou verzi