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 05:55 | Zajímavý projekt

V pátek byl představen projekt postmarketOS (GitHub). Cílem tohoto projektu je open source operační systém pro chytré telefony vycházející z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Operační systém postmarketOS by měl podporovat 10letý životní cyklus chytrých telefonů.

Ladislav Hagara | Komentářů: 4
včera 23:44 | Nová verze

Byla vydána verze 0.4.5 svobodného operačního systému ReactOS. Z novinek lze zdůraznit podporu kancelářského balíku Microsoft Office 2010. Podrobnosti v ChangeLogu.

Ladislav Hagara | Komentářů: 2
včera 23:11 | Komunita

Linphone 4.0 pro desktop přichází. Vývojáři tohoto multiplatformního open source VoIP a SIP klienta postupně představují nové vlastnosti. Verze 4.0 bude postavena na Qt [reddit].

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

Dle plánu byl měl Debian 9 s kódovým názvem Stretch vyjít v sobotu 17. června. Po celém světě se začínají plánovat Release Parties. Oznámeno bylo vydání čtvrté RC (release candidate) verze instalátoru pro Debian 9 Stretch.

Ladislav Hagara | Komentářů: 5
26.5. 22:22 | Komunita

V Norimberku probíhá do neděle 28. května openSUSE Conference 2017. Na programu je celá řada zajímavých přednášek. Sledovat je lze online. K dispozici jsou také videozáznamy (YouTube) již proběhnuvších přednášek. Dění lze sledovat na Twitteru.

Ladislav Hagara | Komentářů: 0
26.5. 11:33 | IT novinky

Red Hat kupuje společnost Codenvy stojící za stejnojmenným webovým (cloudovým) integrovaným vývojovým prostředím (WIDE) postaveném na Eclipse Che.

Ladislav Hagara | Komentářů: 0
26.5. 08:55 | Nová verze

V listopadu 2014 byl představen fork Debianu bez systemd pojmenovaný Devuan. Po dva a půl roce jeho vývojáři oznámili vydání první stabilní verze 1.0. Jedná se o verzi s dlouhodobou podporou (LTS) a její kódové jméno je Jessie, podle planetky s katalogovým číslem 10 464.

Ladislav Hagara | Komentářů: 15
25.5. 20:22 | Zajímavý článek

Nadace Raspberry Pi vydala již osmapadesáté číslo (pdf) stostránkového anglicky psaného časopisu MagPi věnovanému Raspberry Pi a projektům postaveným na tomto jednodeskovém počítači a druhé číslo (pdf) časopisu Hello World primárně určeného pro učitele informatiky a výpočetní techniky.

Ladislav Hagara | Komentářů: 0
25.5. 19:55 | Humor

Portál Stack Overflow informuje na svém blogu, že pomohl ukončit editor Vim už více než milionu vývojářů. V loňském roce například hledal odpověď na otázku Jak ukončit editor Vim v průměru 1 z 20 000 návštěvníků.

Ladislav Hagara | Komentářů: 13
25.5. 19:22 | Nová verze

Po pěti měsících od vydání verze 3.5.0 byla vydána nová stabilní verze 3.6.0, tj. první z nové řady 3.6, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie). Z novinek lze zmínit například podporu dvou nových 64bitových platforem little-endian POWER machines (ppc64le) a IBM z Systems (s390x) nebo nové balíčky Rust 1.17.0, Cargo 0.18.0, GHC 8.0.2 a Julia 0.5.2.

Ladislav Hagara | Komentářů: 0
Chystáte se pořídit CPU AMD Ryzen?
 (6%)
 (33%)
 (1%)
 (8%)
 (44%)
 (9%)
Celkem 632 hlasů
 Komentářů: 62, poslední 19.5. 01:57
    Rozcestník

    Dotaz: Postgresql - obmedzenie počtu referencií

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

    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.

    A fine is a tax for doing wrong. A tax is a fine for doing well.

    Ř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: 45 | 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.
    A fine is a tax for doing wrong. A tax is a fine for doing well.
    AraxoN avatar 11.8.2007 12:56 AraxoN | skóre: 45 | 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...
    A fine is a tax for doing wrong. A tax is a fine for doing well.
    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: 45 | 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?
    A fine is a tax for doing wrong. A tax is a fine for doing well.
    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: 45 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql - obmedzenie počtu referencií
    Super, ďakujem! S INITIALLY DEFERRED to chodí.
    A fine is a tax for doing wrong. A tax is a fine for doing well.
    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: 45 | 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.
    A fine is a tax for doing wrong. A tax is a fine for doing well.

    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.