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í
×

    dnes 17:00 | Zajímavý projekt

    Linux ve Scratchi. Ne Linux v linuxové distribuci Linux From Scratch ale Linux bežící v emulátoru procesoru RISC-V ve vizuálním programovacím jazyce Scratch.

    Ladislav Hagara | Komentářů: 0
    dnes 16:22 | Pozvánky

    Dnes ve 12 hodin začal další ročník CTF (Capture the Flag) soutěže The Catch: "Tentokrát nás kolegové z Forenzní laboratoře zavedou na loď plnou sofistikovaných síťových technologiích, kde soutěžící budou muset zvládnout náročné úkoly. Loď nese jméno našeho skvělého kolegy Josefa Vericha – síťového guru. Tradičně se soutěž koná v říjnu – měsíci kybernetické bezpečnosti."

    Ladislav Hagara | Komentářů: 0
    dnes 07:00 | Pozvánky

    Konference LinuxDays 2023 proběhne již tento víkend 7. a 8. října v prostorách Fakulty informačních technologií Českého vysokého učení v Praze (FIT ČVUT). Na programu je spousta zajímavých přednášek a workshopů.

    Ladislav Hagara | Komentářů: 0
    včera 22:33 | IT novinky

    Netflix v pátek 29. září odeslal poslední film na DVD (YouTube). Společnost dnes známá jako streamovací služba začala před 25 lety jako půjčovna filmů na DVD. Zákazník si DVD objednal na webových stránkách, odesláno mu ale bylo klasickou poštou. Po zhlédnutí jej vložil do obálky a poslal zpět.

    Ladislav Hagara | Komentářů: 13
    30.9. 17:11 | Bezpečnostní upozornění

    Zero Day Initiative zveřejnila informace o 6 bezpečnostních chybách (1, 2, 3, 4, 5, 6) v MTA Exim. Nejvážnější z nich CVE-2023-42115 má CVSS 9.8. Na opravě chyb se pracuje.

    Ladislav Hagara | Komentářů: 10
    30.9. 16:33 | Bezpečnostní upozornění

    Knihovna libvpx byla vydána ve verzi 1.13.1. Řešena je kritická bezpečnostní chyba CVE-2023-5217 (heap buffer overflow in vp8 encoding). Chyba je již opravena také v Chrome / Chromium 117.0.5938.132 a Firefoxu 118.0.1.

    Ladislav Hagara | Komentářů: 0
    29.9. 23:55 | Nová verze

    Balíček kmod s nástroji pro práci s linuxovými moduly byl vydán ve verzi 31. Nově umí modprobe zavést modul nacházející se v libovolném adresáři (# modprobe ./drivers/gpu/drm/i915/i915.ko).

    Ladislav Hagara | Komentářů: 0
    29.9. 23:11 | IT novinky

    Adventura Trüberbrook je na portále GOG.com zdarma, akce trvá do 2. října.

    Fluttershy, yay! | Komentářů: 2
    29.9. 12:44 | Nová verze

    Sound Open Firmware, projekt Linux Foundation, open source audio DSP firmware a SDK, byl vydán ve verzi 2.7.0. Z novinek lze vypíchnout podporu platformy AMD Van Gogh.

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

    Richard Stallman v den oslav 40. výročí GNU oznámil, že má rakovinu (YouTube).

    Ladislav Hagara | Komentářů: 66
    Raději
     (64%)
     (36%)
    Celkem 22 hlasů
     Komentářů: 2, poslední včera 20:39
    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: 508×

    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.