abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    5.6. 22:22 | Nová verze

    Byla vydána nová verze 9.7 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Přehled novinek, vylepšení a oprav v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    5.6. 18:22 | Komunita

    Vývojáři webového prohlížeče Ladybird dnes oznámili, že mění způsob vývoje. S blížícím se vydáním alfa verze přestávají přijímat veřejné pull requesty. Všechny otevřené veřejné pull requesty budou uzavřeny. Tým nedokáže garantovat bezpečnost AI generovaných pull requestů.

    Ladislav Hagara | Komentářů: 2
    5.6. 17:33 | Zajímavý software

    OpenLogi (GitHub) je open source náhrada aplikace Logi Options+ pro přizpůsobení myší od společnosti Logitech. Zatím běží pouze na macOS.

    Ladislav Hagara | Komentářů: 1
    5.6. 04:33 | Nová verze

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za květen (YouTube).

    Ladislav Hagara | Komentářů: 9
    4.6. 11:22 | Bezpečnostní upozornění

    Úřad pro ochranu osobních údajů řeší desítky stížností na jednotné měsíční hlášení zaměstnavatele, které stát spustil počátkem dubna. Systém, jenž má firmám odlehčit od desítek formulářů, nejenže výrazně zatížil jejich účetní oddělení, ale docházelo v něm i k únikům osobních dat zaměstnanců k firmám, kde nepracovali. Podle ministerstva práce a sociálních věcí stála za problémem technická chyba. „Incident se týkal několika stovek

    … více »
    Ladislav Hagara | Komentářů: 22
    4.6. 10:46 | Nová verze

    Byla vydána (𝕏, Bluesky) nová verze 22.0.0 open source webového aplikačního frameworku Angular (Wikipedie). Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    4.6. 04:33 | Nová verze

    Vim Classic byl vydán ve verzi 8.3. Drew DeVault oznámil tento fork editoru Vim (verze 8.2.0148, tj. těsně před zavedením Vim9 skriptování) v březnu letošního roku. Důvodem forku bylo, že vývojáři editorů Vim a Neovim začali při vývoji využívat LLM.

    Ladislav Hagara | Komentářů: 7
    4.6. 03:44 | Komunita

    Open source konference DevConf.CZ 2026 proběhne 18. a 19. června v Brně na FIT VUT. Publikován byl program a spuštěna byla registrace.

    Ladislav Hagara | Komentářů: 0
    3.6. 19:44 | Nová verze

    Společnost JetBrains uvolnila verzi 2 svého open-source velkého jazykového modelu (LLM) pro vývojáře Mellum.

    Ladislav Hagara | Komentářů: 0
    3.6. 14:44 | IT novinky

    Probíhá konference Microsoft Build 2026. Microsoft představuje své novinky: kvantový čip Majorana 2, Surface Laptop Ultra a Surface RTX Spark Dev Box s NVIDIA RTX Spark, Intelligent Terminal, Coreutils for Windows (fork Rust Coreutils), AI modely MAI, AI agenta Scout, platformu pro agent-first zařízení Project Solara, …

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (12%)
     (8%)
     (2%)
     (15%)
     (31%)
     (3%)
     (6%)
     (3%)
     (15%)
     (26%)
    Celkem 1838 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Postgresql - obmedzenie počtu referencií

    AraxoN avatar 10.8.2007 17:11 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Postgresql - obmedzenie počtu referencií
    Přečteno: 593×

    Zdravím.

    Mám Postgres 8.0.13, v ňom databázu s takýmito tabuľkami:

    CREATE TABLE uzivatel (
      id SERIAL NOT NULL,
      meno VARCHAR NOT NULL,
      PRIMARY KEY (id)
    );
    INSERT INTO uzivatel (meno) VALUES ('Jozko');
    -- dostane id = 1
    INSERT INTO uzivatel (meno) VALUES ('Ferko');
    -- dostane id = 2
    INSERT INTO uzivatel (meno) VALUES ('Samko');
    -- dostane id = 3
    
    CREATE TABLE uloha (
      id SERIAL NOT NULL,
      zadavatel INT REFERENCES uzivatel (id) ON UPDATE CASCADE ON DELETE SET NULL,
      riesitel INT REFERENCES uzivatel (id) ON UPDATE CASCADE ON DELETE SET NULL,
      kontrolor INT REFERENCES uzivatel (id) ON UPDATE CASCADE ON DELETE SET NULL,
    -- plus nejake dalsie nepodstatne stlpce
      PRIMARY KEY (id)
    );
    INSERT INTO uloha (zadavatel, riesitel, kontrolor) VALUES (1,NULL,NULL);
    INSERT INTO uloha (zadavatel, riesitel, kontrolor) VALUES (2,2,NULL);
    INSERT INTO uloha (zadavatel, riesitel, kontrolor) VALUES (3,3,3);

    T.j. sú tam užívatelia a úlohy k nim. Eviduje sa kto úlohu zadal, kto ju rieši (resp. riešil) a kto ju skontroloval. Je to ošetrené referenciami tam, aby zmazanie užívateľa nastavilo v príslušnom stĺpci NULL. Problém nastáva, ak vo všetkých 3 stĺpcoch je tá istá hodnota (ten istý užívateľ). Pri pokuse o vymazanie takého užívateľa sa to zasekne, namiesto toho aby nastavilo všade NULL:

    araxon=# DELETE FROM uzivatel WHERE id=1; -- toto je v pohode
    DELETE 1
    araxon=# DELETE FROM uzivatel WHERE id=2; -- toto je este tiez v pohode
    DELETE 1
    araxon=# DELETE FROM uzivatel WHERE id=3; -- a toto uz je problem
    ERROR:  insert or update on table "uloha" violates foreign key constraint "uloha_kontrolor_fkey"
    DETAIL:  Key (kontrolor)=(3) is not present in table "uzivatel".
    CONTEXT:  SQL statement "UPDATE ONLY "public"."uloha" SET "riesitel" = NULL WHERE "riesitel" = $1"

    T.j. ak sú referencie na užívateľa len v jednom či dvoch stĺpcoch, tak to ide, ale v troch a viac sa to už sekne. Vyzerá to, že pri mazaní toho tretieho užívateľa to opraví prvé dve referencie (zadavatel, riesitel) a potom sa pokúsi užívateľa vymazať nehľadiac na tretiu referenciu (kontrolor). Bude to najskôr nejaký limit, ktorý je v Postgresi zakomponovaný natvrdo. Ak sa na ten istý záznam odkazujú len ľubovoľné 2 stĺpce, tak to ide bez problémov, ak ich je viac, tak to už zlyhá. Nenašiel som k tomuto nič v dokumentácii, ani na fórach, tak sa pýtam: nestretol sa s tým niekto? Viem, že je možné zmeniť štruktúru aplikácie, ale toto je len príklad - v skutočnosti to máme zložitejšie, týka sa to viacerých tabuliek a je to nasadené kade-tade. Tento problém nie je vôbec častý, akurát trochu nahlodáva moju vieru v to, že všetko vždy bude fungovať tak ako má.

    Otázka teda znie: dá sa tento limit nastaviť v konfigurácii, alebo pri kompilácii postgresu? Rád by som to vyriešil bez toho aby trebalo meniť aplikáciu - o referenčnú integritu sa má starať databáza, a nie že to bude kontrolovať ešte aj aplikácia.


    Řešení dotazu:


    Odpovědi

    10.8.2007 17:24 johniez | skóre: 17 | blog: xyz | Praha
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    je to divny, na prvni pohled by to melo slapat..

    nejhur tam dej misto tech tri references triger na tabulku uzivatel ve kterym provedes update tabulky uloha..
    AraxoN avatar 11.8.2007 12:22 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Triggery som ešte nerobil... Naštudujem a skúsim. Zatiaľ dík.
    AraxoN avatar 11.8.2007 12:56 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Nie je to dobré: trigger by sa musel spustiť ešte pred zmazaním užívateľa. Samotné zmazanie sa ale môže nevykonať kvôli niečomu inému (napríklad ON DELETE RESTRICT v nejakej úplne inej tabuľke, ktorá sa na užívateľa odkazuje), takže by sa mohlo stať, že v jeho úlohách už nastavím NULL, ale nakoniec ho vôbec nevymažem...
    11.8.2007 14:53 johniez | skóre: 17 | blog: xyz | Praha
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    after delete trigger...

    a kdyz bych chtel mit jistotu udelam na mazani proceduru, ktera to muze kontrolovat..
    AraxoN avatar 11.8.2007 16:10 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    keď sa to má spustiť až po vymazaní, tak sa to nespustí vôbec, lebo k vymazaniu ani nedôjde... či nie?
    11.8.2007 09:08 Pavel Stehule
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    tohle by fungovat melo, zkusim se poptat v konferenci. Jinak muzete zkusit deferred pravidla. Pri ni se referencni integrita kontroluje az v okamziku commitu.
    11.8.2007 11:26 Pavel Stehule
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Je zajimavy, ze tohle projde
    CREATE TABLE users (
      id SERIAL NOT NULL,
      name VARCHAR NOT NULL,
      PRIMARY KEY (id)
    );
    
    INSERT INTO users VALUES (1, 'Jozko');
    INSERT INTO users VALUES (2, 'Ferko');
    INSERT INTO users VALUES (3, 'Samko');
    
    CREATE TABLE tasks (
      id SERIAL NOT NULL,
      owner INT REFERENCES  users (id) ON UPDATE CASCADE ON DELETE SET NULL,
      worker INT REFERENCES users (id) ON UPDATE CASCADE ON DELETE SET NULL,
      checked_by INT REFERENCES users (id) ON UPDATE CASCADE ON DELETE SET NULL,
      PRIMARY KEY (id)
    );
    INSERT INTO tasks VALUES (1,NULL,NULL);
    INSERT INTO tasks VALUES (2,2,NULL);
    INSERT INTO tasks VALUES (3,3,3);
    
    DELETE FROM users WHERE id = 1; -- works simple
    DELETE FROM users WHERE id = 2; -- works ok
    DELETE FROM users WHERE id = 3; -- doesn't work, why
    
    11.8.2007 17:04 Pavel Stehule
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Tohle jsem spatne prepsal, sorry. Kdybych to prepsal korektne, tak to nebude fungovat taky.
    11.8.2007 17:17 Pavel Stehule
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Sice netusim, proc to projde u dvou sloupcu a uz to neprojde u tri, nicmene pomouhou tzv, odlozene podminky (jak uz jsem psal) deferred constraints. Nasledujici test projde:
    CREATE TABLE users (
     id integer NOT NULL,
     name VARCHAR NOT NULL,
     PRIMARY KEY (id)
    );
    
    INSERT INTO users VALUES (1, 'Jozko');
    INSERT INTO users VALUES (2, 'Ferko');
    INSERT INTO users VALUES (3, 'Samko');
    
    CREATE TABLE tasks (
     id integer NOT NULL,
     owner INT REFERENCES  users (id) ON UPDATE CASCADE ON DELETE SET NULL INITIALLY DEFERRED,
     worker INT REFERENCES users (id) ON UPDATE CASCADE ON DELETE SET NULL INITIALLY DEFERRED,
     checked_by INT REFERENCES users (id) ON UPDATE CASCADE ON DELETE SET NULL INITIALLY DEFERRED,
     PRIMARY KEY (id)
    );
    INSERT INTO tasks VALUES (1,1,NULL,NULL);
    INSERT INTO tasks VALUES (2,2,2,NULL);
    INSERT INTO tasks VALUES (3,3,3,3);
    
    DELETE FROM users WHERE id = 1; -- works simple
    DELETE FROM users WHERE id = 2; -- works ok
    DELETE FROM users WHERE id = 3; -- works too
    
    Docela bych rekl, ze se jedna o bug postgresql (vlastnost), resp. nedomyslenost pri vyhodnocovani podminek.

    Pavel
    AraxoN avatar 11.8.2007 17:37 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Super, ďakujem! S INITIALLY DEFERRED to chodí.
    14.8.2007 22:50 Pavel Stehule
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    tak 100% se jedna o bug. Patch s opravou je k dispozici na http://archives.postgresql.org/pgsql-patches/2007-08/msg00104.php a pokud se nic nestane, tak v dalsich minoritnich verzich tato chyba bude opravena.

    Pavel
    AraxoN avatar 14.8.2007 23:22 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Dobrá práca! Moja obľúbená databáza je tak zase o čosi spoľahlivejšia.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.