PostgreSQL a temporary tabulky a trideni

Karel Zak zakkr na zf.jcu.cz
Středa Únor 25 16:51:24 CET 2004


On Wed, Feb 25, 2004 at 03:38:53PM +0100, Honza Pazdziora wrote:
> Od temporary tabulky bych tak nejak ocekaval, ze ji jednou vyrobim (to
> je DDL operace, takze to by mel delat nekdo s dostatecne vysokymi
> pravy), ona bude existovat, ale kazda session bude zacinat s cistym
> obsahem. A uzivatele (s DML pravy) v ni budou pracovat. V PostgreSQL
> ovsem ta tabulka po skonceni session zmizi.

 Hmm, pokud  je mi znamo  tak zadny  standard nic takoveho  nedefinuje a
 proste v  PostgreSQL plati,  ze docasnost  je dana  prave session. IMHO
 todle je to co jsem nedavno  kritizovali u debaty s xbase -- ocekavani,
 ze  "spravne" je  to na  co jsem  doposud navyknuty. Treba  me soucasne
 chovani vyhovuje.

> No, tohle nema byt co zklamanim, protoze tohle jaksi predem vis.
> Zatimco PostgreSQL ma podporu spousty proceduralnich jazyku, ale minimalne
> v tom "nativnim" (PL/pgSQL) se nedaji pekne udelat promenne pouzitelne

 Ja osobne PLSQL povazuji za pokus jak  tem co se jednou naucili SQL dat
 moznost  delat v  "temer  SQL"  to co  SQL  neumi. Pokud  to srovnam  s
 libovolnym jinym  jazykem tak je  to dost krkolomny  a ja osobne  v tom
 pisu jen nekolikaradkove veci.

 Jinak uznavam, ze Oracle je v na tom s funkcema lepe.

> Uzivatele klikaji autentizovane na Webu. Chci u jednotlivych zmen
> v databazi logovat, kdo tu zmenu udelal. Do databaze ten aplikacni
> server jde pod jednim uzivatelem. Chtel bych nejlepe jeste pred

 Jde pomoci  SET SESSION  AUTHORIZATION <user> prepinat  pod superuserem
 na  jine  uzivatele. Funkce  getpgusername()  pak  vraci  jmeno  usera.
 Pochopitelne v rade pripadu kde interface_user != DB_user je to na nic.

> spustenim toho aplikacniho handleru nastavit nejakou promennou v tom
> databazovem spojeni, ktera by se pak pouzila ve vsech tedy insert /
> update / delete triggerech jako hodnota prave prihlaseneho vzdaleneho
> uzivatele a predala do logovacich tabulek.
> 
> Nejblize, jak jsem se dostal k reseni, je pokazde testovat, jestli
> uz dana pomocna tabulka existuje (protoze jsem ji mohl zdedit
> s presistentnim db spojenim), pokud ne, tak ji vytvorit, commitnout,
> ulozit hodnotu, a pouzivat. A ty manipulace s ni musim delat pres
> execute '', protoze primy select se chytne na nejaky interni
> identifikator, ktery o kousek dal uz neexistuje. Oc jednodussi by
> to bylo, kdybych vedel, ze ta tabulka vzdy bude existovat, protoze
> jsem ji jednou v ramci vytvareni datoveho schematu vytvoril,
> dokonce bych si nad ni mohl udelat primarni klice a foreign klice
> a tak, a kazda session by do ni pouze dala aktualni data.

 Takze nakonec  to reseni ma a  jedina vada na krase  je nutnost zjistit
 jsem-li prvni v  dane session nebo ne -- coz  muze celkem snadno udelat
 klient co  zaklada tu session  a po  navazani spojeni mimo  jinych veci
 nainicializuje i  tu potrebnou  temp tabulku. Ty  rutiny co  tu tabulku
 pouzivaji nic zjistovat nemuseji. IMHO je to problem logiky aplikace.

> A co treba ruzna trideni? Jak se to da v PostgreSQL rozumne

 Ano to je vetsi problem.

> udelat? Ano, pouziti locales je fajn, jenze co se stane, kdyz
> zupgraduju glibc-common a jako na potvoru tam definice locales bude
> trosku jina? Rekl bych, ze mi to rozpadne indexy. Nehlede na to, ze by

 Jo, ale to  znamena vykaslat se na systemove locales  a udelat vlastni.
 Coz uz v konferencich PostgreSQL zaznelo a podle mne to tak i dopadne.

> fakt vcelku rad jednou delal order by anglicky a jednou cesky -- tuhle
> se tady na to nekdo ptal a odpoved provest initdb se spravnym
> LC_COLLATE neni uplne to prave orechove. V Oraclu je to parametr
> klienta (NLS_SORT), menitelny, plus jeste kazdy order by muze pouzit
> svoje nls nastaveni. Co PostgreSQL? Skoro uvazuju, ze budu muset
> sednout a naportovat do PostgreSQL svou radici rutinu z MySQL.
> Alternativne by se to mozna dalo napsat i pomoci strxfrm, aby to bylo
> kompatibilni s localovym PostgreSQLim pristupem. Jen me prekvapuje,
> ze odpovedi jsou vesmes "udelej spravne initdb", misto aby vyvojari
> rekli, ze radit podle ruznych kriterii neni uplne nesmyslny napad
> a ze to nema co byt zadratovany parametr databazove instalace.

 Pouzivani ruznych locales neni nesmysl a  urcite se o tom uvazuje.  Jen
 proste udelat nejake systemove reseni neni uplne trivialni a pri vyvoji
 PostgreSQL se vetsinou jine reseni  nedelaji, a nez nejaky necisty hack
 tak radeji nekolik release nic...

    Karel

-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/


Další informace o konferenci Test