Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Problem mit pg_restore und check constraint

  1. #1
    furianer ist offline Benutzer
    Registriert seit
    22.04.2008
    Beiträge
    49

    Standard Problem mit pg_restore und check constraint

    Hi @ all,
    eine meiner Tabellen enthält zwei Check-constraints, die je eine Funktion aufrufen:
    Code:
    ALTER TABLE table ADD CONSTRAINT verify_homa_ir CHECK (verify_homa_ir(homa_ir, id));
    und
    Code:
    ALTER TABLE table ADD CONSTRAINT verify_homa_proz_b CHECK (verify_homa_proz_b(homa_proz_b, id));
    Die zugehörige Funktion des ersten Check:
    Code:
    CREATE OR REPLACE FUNCTION verify_homa_ir(numeric, integer)
      RETURNS boolean AS
    $BODY$
    declare
        homa_given alias for $1;
        given_checkup_id alias for $2;
        homa_calc table.homa_ir%TYPE;
    begin
        homa_calc := (blablabla);
        
        if
            homa_calc = homa_given or homa_given is null
        then
            return true;
        else
    
            return false;
        end if;
    end;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE;
    ALTER FUNCTION verify_homa_ir(numeric, integer) OWNER TO owner_one;
    Die zweite Funktion sieht quasi genauso aus.
    Ich habe einen Dump erstellt mittels
    Code:
    /usr/bin/pg_dump -i -h localhost -p 5432 -U owner_one -F c -b -f my_backup my_db
    und dies ist der anschließende Restorebefehl (Datenbank vorher gelöscht):
    Code:
    pg_restore -C -d postgres Desktop/my_db
    Die Datenbank wird zwar wiederhergestellt, ist aber leer. Ich bekomme eine Reihe von Fehlern aufgrund fehlender Fremdschlüssel, die alle auf diesen Fehler folgen:
    Code:
    pg_restore: [archiver (db)] Error while PROCESSING TOC:
    pg_restore: [archiver (db)] Error from TOC entry 1861; 0 17032 TABLE DATA table owner_one
    pg_restore: [archiver (db)] COPY failed: ERROR:  new row for relation "table" violates check constraint "verify_homa_ir"
    CONTEXT:  COPY table, line 20: "<Zeileninhalt>"
    Ich kann beide Checks löschen, neu dumpen und alles ist gut. Die Zeile, die den Fehler ausgelöst hat, ist ebenfalls ok, widerspricht dem Constraint also nicht.
    Jemand ne Idee, wie ich auch _mit_ constraints dumpen und wiederherstellen kann?
    Postgresversion 8.2.4
    Thx.

  2. #2
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    ich vermute das geheimnis in homa_calc - bzw. in blablabla

    dass du einen fehler in dem check_constraint hast .. der berechnung, die nun wegen anderer situation in einen fehler laeuft ..

    was macht denn blabla? es sollte ja nen key oder zahl (numeric?) berechnen ..

    ausserdem .. wenn homa_calc null ist .. dann ist null = null > false

    Code:
    begin
        homa_calc := (blablabla);
        
        if
            homa_calc = homa_given or homa_given is null
        then
            return true;
        else
    
            return false;
        end if;
    end;
    uebrigends kannst du den code (wenn er denn funzt) auch abkuerzen

    Code:
    begin
        homa_calc := (blablabla);
        
        return homa_calc = homa_given or homa_given is null;
    end;
    Geändert von symbiont (01.10.2009 um 10:53 Uhr)

  3. #3
    furianer ist offline Benutzer
    Registriert seit
    22.04.2008
    Beiträge
    49

    Standard

    Genau, blabla holt sich per select aus anderen Tabellen ein paar Datensätze mit derselben ID und gibt einfach ne daraus berechnete Dezimalzahl zurück.
    Ok, sofern der einzelne Datensatz noch nicht komplett ist, wird das Check nicht funktionieren, das klappt erst danach. Andererseits können ja auch Einträge mit Fremdschlüsseln erst geschrieben werden, wenn der zugehörige Primärschlüssel schon existiert und das klappt ja auch. Ist mir nicht ganz klar, ebenso ein Workaround...
    Und daß mit null = null > false umgehe ich dann durch vertauschen der Reihenfolge:
    Code:
    homa_given is null or homa_calc = homa_given
    Thx!

    Edit: create constraint trigger statt des check müsste funzen als workaround
    Geändert von furianer (01.10.2009 um 13:25 Uhr)

  4. #4
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    nunja .. bei dem restore wird wohl zuerst das modell erzeugt .. alle constrains und alle trigger ..

    da spielt es auch keine rolle, dass die tables alle leer sind - ist sogar von vorteil ..

    nur bloederweise wird dann wohl die db in der falschen reihenfolge befuellt? da muss ich mal nachlesen ob das moeglich ist

    es gibt ja auch zirkulare referenzen ... etc. .. das mit den abhaengigkeiten ist nicht einfach .. ich deke mit dem constraint-trigger bist auf dem richtigen weg
    Geändert von symbiont (01.10.2009 um 13:53 Uhr)

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von furianer Beitrag anzeigen
    Jemand ne Idee, wie ich auch _mit_ constraints dumpen und wiederherstellen kann?
    Postgresversion 8.2.4
    Thx.
    Naja, das Problem scheint ja geklärt: dein CHECK erwartet, daß da zuerst eine andere Tabelle gefüllt ist, erst dann kann der funktionieren. PG kann manches, aber nicht die Logik in Deiner Check-Funktion erkennen.

    Eine Lösung wäre, beim Restore zu sagen, daß zuerst diese eine Tabelle zu befüllen ist. Also erst einmal mit pg_restore -l ein Listfile aller Objekte erzeugen, dieses mit $EDITOR so bearbeiten, daß die Reihenfolge stimmt, und dann pg_restore -L laufen lassen. Ungetestet.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    Ungetestet, aber genau das ist der dafür vorgeschlagene Weg.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    muss aber auch nicht immer funktionieren

    die wege von check_constraints sind manchmal unergruendlich ..

    so kann es z.B. vorkommen, dass row A eine referenz auf B erwartet, was wiederum eine referenz auf ein frueheres A erwartet .. so chronologische modelle ..

    dann ist ein constraint_trigger immernoch die bessere wahl ..

    vielleicht sollte man aber beides in betracht ziehen

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von symbiont Beitrag anzeigen
    nunja .. bei dem restore wird wohl zuerst das modell erzeugt .. alle constrains und alle trigger ..

    da spielt es auch keine rolle, dass die tables alle leer sind - ist sogar von vorteil ..
    Im übrigen mal wieder ein schönes Beispiel von mal wieder was geschrieben, von dem Du keine Ahnung hast.

    Code:
    test=# create schema symbiont;
    CREATE SCHEMA
    test=*# set search_path=symbiont;
    SET
    test=*# commit;
    COMMIT
    test=# create table a (aid int primary key, atext text);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
    CREATE TABLE
    test=*# create table b (bid int primary key, btext text, akey int references a deferrable);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
    CREATE TABLE
    test=*# alter table a add column bkey int references b deferrable;
    ALTER TABLE
    test=*# set constraints all deferred;
    SET CONSTRAINTS
    test=*# insert into a values (1, 'text a', 3);
    INSERT 0 1
    test=*# insert into b values (3, 'text b', 1);
    INSERT 0 1
    test=*# commit;
    COMMIT
    test=# \q
    Das Backup dazu sieht so aus (gekürzt):

    pg_dump -n symbiont test
    Code:
    --
    -- Name: a; Type: TABLE; Schema: symbiont; Owner: kretschmer; Tablespace: 
    --                                                                        
    
    CREATE TABLE a (
        aid integer NOT NULL,
        atext text,          
        bkey integer         
    );                       
    
    
    ALTER TABLE symbiont.a OWNER TO kretschmer;
    
    --
    -- Name: b; Type: TABLE; Schema: symbiont; Owner: kretschmer; Tablespace: 
    --                                                                        
    
    CREATE TABLE b (
        bid integer NOT NULL,
        btext text,          
        akey integer         
    );                       
    
    
    ALTER TABLE symbiont.b OWNER TO kretschmer;
    
    --
    -- Data for Name: a; Type: TABLE DATA; Schema: symbiont; Owner: kretschmer
    --                                                                        
    
    COPY a (aid, atext, bkey) FROM stdin;
    1       text a  3                    
    \.                                   
    
    
    --
    -- Data for Name: b; Type: TABLE DATA; Schema: symbiont; Owner: kretschmer
    --                                                                        
    
    COPY b (bid, btext, akey) FROM stdin;
    3       text b  1
    \.
    
    
    --
    -- Name: a_pkey; Type: CONSTRAINT; Schema: symbiont; Owner: kretschmer; Tablespace:
    --
    
    ALTER TABLE ONLY a
        ADD CONSTRAINT a_pkey PRIMARY KEY (aid);
    
    
    --
    -- Name: b_pkey; Type: CONSTRAINT; Schema: symbiont; Owner: kretschmer; Tablespace:
    --
    
    ALTER TABLE ONLY b
        ADD CONSTRAINT b_pkey PRIMARY KEY (bid);
    
    
    --
    -- Name: a_bkey_fkey; Type: FK CONSTRAINT; Schema: symbiont; Owner: kretschmer
    --
    
    ALTER TABLE ONLY a
        ADD CONSTRAINT a_bkey_fkey FOREIGN KEY (bkey) REFERENCES b(bid) DEFERRABLE;
    
    
    --
    -- Name: b_akey_fkey; Type: FK CONSTRAINT; Schema: symbiont; Owner: kretschmer
    --
    
    ALTER TABLE ONLY b
        ADD CONSTRAINT b_akey_fkey FOREIGN KEY (akey) REFERENCES a(aid) DEFERRABLE;
    
    
    --
    -- PostgreSQL database dump complete
    --
    PG erzeugt also Constraints etc. erst zum Schluß. Ich kann Dir auch erklären, warum: es geht schneller und PG kann davon ausgehen, daß ein Dump in sich konsistent ist. Und falls nicht, würde es zum Ende knallen.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Im übrigen mal wieder ein schönes Beispiel von mal wieder was geschrieben, von dem Du keine Ahnung hast.

    PG erzeugt also Constraints etc. erst zum Schluß. Ich kann Dir auch erklären, warum: es geht schneller und PG kann davon ausgehen, daß ein Dump in sich konsistent ist. Und falls nicht, würde es zum Ende knallen.


    Andreas
    eher ein schoenes beispiel fuer dein ueberhebliches rumgetoene . du musst wirklich schlimme probleme haben

    wenn dem so waere, dürfte der OP das problem nicht haben ..

    offenbar erzeugt er nicht alle constraints "zum schluss" - weshalb es nahe des endes eben genau "knallt"
    Geändert von symbiont (01.10.2009 um 15:16 Uhr)

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von symbiont Beitrag anzeigen
    offenbar erzeugt er nicht alle constraints "zum schluss" - weshalb es nahe des endes eben genau "knallt"
    Sorry, Check-Constraints werden mit der Tabelle erstellt, hast Recht.

    Hm, blöd.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Check plus Funktion Problem
    Von furianer im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 23.07.2009, 12:46
  2. Antworten: 7
    Letzter Beitrag: 14.01.2009, 16:26
  3. Frage CHECK-Constraint vs. UNIQUE-Index
    Von symbiont im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 26.09.2008, 10:45
  4. Partitionierung - Dynamische Constraint-Check's
    Von CenText im Forum Trigger und Funktionen
    Antworten: 4
    Letzter Beitrag: 15.07.2008, 08:12
  5. pg_dump ung pg_restore
    Von pg_smu im Forum Migration
    Antworten: 2
    Letzter Beitrag: 10.05.2007, 14:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum