abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 23:33 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 141 (pdf) a HackSpace 78 (pdf).

    Ladislav Hagara | Komentářů: 0
    včera 21:22 | Nová verze

    Byla vydána verze 2.0.0 programovacího jazyka Kotlin (Wikipedie, GitHub). Oficiálně bude představena ve čtvrtek na konferenci KotlinConf 2024 v Kodani. Livestream bude možné sledovat na YouTube.

    Ladislav Hagara | Komentářů: 1
    včera 12:55 | Nová verze

    Byla vydána nová major verze 27.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 01:11 | Nová verze

    Byla vydána nová verze 1.8.0 svobodného multiplatformního softwaru pro konverzi video formátů HandBrake (Wikipedie). Přehled novinek v poznámkách k vydání na GitHubu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    20.5. 21:55 | IT novinky

    Microsoft představil nové označení počítačů Copilot+. Dle oznámení se jedná se o počítače poskytující funkce umělé inteligence. Vedle CPU a GPU mají také NPU (Neural Processing Unit). Uvnitř představených Copilot+ notebooků běží ARM čipy Qualcomm Snapdragon X Elite nebo X Plus.

    Ladislav Hagara | Komentářů: 4
    20.5. 17:55 | Zajímavý článek

    Příspěvek na blogu Codean Labs rozebírá zranitelnost CVE-2024-4367 v PDF.js, tj. mj. prohlížeči PDF souborů ve Firefoxu. Při otevření útočníkem připraveného pdf souboru může být spuštěn libovolný kód v JavaScriptu. Vyřešeno ve Firefoxu 126.

    Ladislav Hagara | Komentářů: 1
    20.5. 12:55 | Nová verze

    Lazygit byl vydán ve verzi 0.42.0. Jedná se o TUI (Text User Interface) nadstavbu nad gitem.

    Ladislav Hagara | Komentářů: 0
    20.5. 12:22 | IT novinky

    K open source herní konzole Picopad přibyla (𝕏) vylepšená verze Picopad Pro s větším displejem, lepšími tlačítky a větší baterii. Na YouTube lze zhlédnout přednášku Picopad - open source herní konzole z LinuxDays 2023.

    Ladislav Hagara | Komentářů: 10
    17.5. 13:44 | Nová verze

    Byla vydána (𝕏) nová major verze 17 softwarového nástroje s webovým rozhraním umožňujícího spolupráci na zdrojových kódech GitLab (Wikipedie). Představení nových vlastností i s náhledy a videi v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    17.5. 12:22 | Komunita

    Sovereign Tech Fund, tj. program financování otevřeného softwaru německým ministerstvem hospodářství a ochrany klimatu, podpoří vývoj FFmpeg částkou 157 580 eur. V listopadu loňského roku podpořil GNOME částkou 1 milion eur.

    Ladislav Hagara | Komentářů: 0
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (80%)
     (5%)
     (8%)
     (7%)
    Celkem 446 hlasů
     Komentářů: 16, poslední 14.5. 11:05
    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: 514×

    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.