Ergebnis 1 bis 9 von 9

Thema: Kein Update bestehender Sätze möglich

  1. #1
    frantek ist offline Neuer Benutzer
    Registriert seit
    09.11.2011
    Beiträge
    5

    Standard Kein Update bestehender Sätze möglich

    Hallo,

    ich habe folgendes - aus meiner Sicht recht merkwürdiges - Problem: Ich habe einer meiner Tabellen, die bereits eine Referenz auf eine andere hatte 4 Felder per "alter" hinzugefügt. Neue Sätze lassen sich problemlos einfüge. Will ich aber die neuen Felder der bestehenden Sätze per Update befüllen dann klappt das nicht. Will heissen, die Inhalte bleiben NULL obwohl das Update keine Fehler gezeigt hat. Ich habe das mit 8.4 und 9.1.1 getestet. Ich verstehe das nicht, da ich so etwas laufend mache und nie Probleme hatte. Kann mir jemand auf die Sprünge helfen?

    TIA
    Matthias

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von frantek Beitrag anzeigen
    Hallo,

    ich habe folgendes - aus meiner Sicht recht merkwürdiges - Problem: Ich habe einer meiner Tabellen, die bereits eine Referenz auf eine andere hatte 4 Felder per "alter" hinzugefügt. Neue Sätze lassen sich problemlos einfüge. Will ich aber die neuen Felder der bestehenden Sätze per Update befüllen dann klappt das nicht. Will heissen, die Inhalte bleiben NULL obwohl das Update keine Fehler gezeigt hat. Ich habe das mit 8.4 und 9.1.1 getestet. Ich verstehe das nicht, da ich so etwas laufend mache und nie Probleme hatte. Kann mir jemand auf die Sprünge helfen?

    TIA
    Matthias
    Kannst Du das auch demonstrieren?

    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

  3. #3
    frantek ist offline Neuer Benutzer
    Registriert seit
    09.11.2011
    Beiträge
    5

    Standard

    klar kann ich das :-)

    Die Spalten ab "lagerbuchung_text" sind neu, also per "alter table" hinzugefügt - und jetzt:

    Code:
    matthias@lx-mh ~ $ psql -U lager -W -h server lager_dev
    Passwort für Benutzer lager: 
    psql (8.4.9, Server 8.3.14)
    WARNUNG: psql-Version 8.4, Serverversion 8.3.
             Einige Features von psql werden eventuell nicht funktionieren.
    Geben Sie »help« für Hilfe ein.
    
    lager_dev=> \d lagerbuchung
                                                    Tabelle »public.lagerbuchung«
            Spalte        |           Typ            |                                 Attribute                                  
    ----------------------+--------------------------+----------------------------------------------------------------------------
     lagerbuchung_id      | bigint                   | not null Vorgabewert nextval('lagerbuchung_lagerbuchung_id_seq'::regclass)
     lagerbuchung_datum   | timestamp with time zone | not null
     lagerbuchung_artikel | bigint                   | not null
     lagerbuchung_menge   | double precision         | not null
     lagerbuchung_text    | character varying(50)    | 
     active               | boolean                  | 
     insby                | bigint                   | 
     modby                | bigint                   | 
     insdate              | timestamp with time zone | 
     moddate              | timestamp with time zone | 
    Indexe:
        "lagerbuchung_pkey" PRIMARY KEY, btree (lagerbuchung_id)
    Fremdschl�ssel-Constraints:
        "lagerbuchung_artikel_fk" FOREIGN KEY (lagerbuchung_artikel) REFERENCES artikel(artikel_id)
    Trigger:
        bestand BEFORE INSERT OR DELETE OR UPDATE ON lagerbuchung FOR EACH ROW EXECUTE PROCEDURE bestand()
    
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    
    lager_dev=> update lagerbuchung set lagerbuchung_text='test', active=true where lagerbuchung_id=18;
    UPDATE 1
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    Und weil es da genau so ist gleich noch mal mit der 9.1.1:

    Code:
    matthias@lx-mh ~ $ psql -U lager -W -h 192.168.100.41 lager_dev
    Passwort für Benutzer lager: 
    psql (8.4.9, Server 9.1.1)
    WARNUNG: psql-Version 8.4, Serverversion 9.1.
             Einige Features von psql werden eventuell nicht funktionieren.
    SSL-Verbindung (Verschlüsselungsmethode: DHE-RSA-AES256-SHA, Bits: 256)
    Geben Sie »help« für Hilfe ein.
    
    lager_dev=> \d lagerbuchung
                                                    Tabelle »public.lagerbuchung«
            Spalte        |           Typ            |                                 Attribute                                  
    ----------------------+--------------------------+----------------------------------------------------------------------------
     lagerbuchung_id      | bigint                   | not null Vorgabewert nextval('lagerbuchung_lagerbuchung_id_seq'::regclass)
     lagerbuchung_datum   | timestamp with time zone | not null
     lagerbuchung_artikel | bigint                   | not null
     lagerbuchung_menge   | double precision         | not null
     lagerbuchung_text    | character varying(50)    | 
     active               | boolean                  | 
     insby                | bigint                   | 
     modby                | bigint                   | 
     insdate              | timestamp with time zone | 
     moddate              | timestamp with time zone | 
    Indexe:
        "lagerbuchung_pkey" PRIMARY KEY, btree (lagerbuchung_id)
    Fremdschlüssel-Constraints:
        "lagerbuchung_artikel_fk" FOREIGN KEY (lagerbuchung_artikel) REFERENCES artikel(artikel_id)
    Trigger:
        bestand BEFORE INSERT OR DELETE OR UPDATE ON lagerbuchung FOR EACH ROW EXECUTE PROCEDURE bestand()
    
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    
    lager_dev=> update lagerbuchung set lagerbuchung_text='test', active=true where lagerbuchung_id=18;
    UPDATE 1
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    QED ... Ich mach so etwas immer zu und nur mit dieser EINEN Tabelle gibt es - warum auch immer - Probleme.

    Dder Vollständigkeit halber:

    Code:
    CREATE OR REPLACE FUNCTION "public"."bestand" ()  RETURNS trigger
      VOLATILE
    AS $dbvis$
    BEGIN
            IF (TG_OP = 'DELETE') THEN
                update artikel set artikel_bestand = artikel_bestand - OLD.lagerbuchung_menge where artikel_id = OLD.lagerbuchung_artikel;
                RETURN OLD;
            ELSIF (TG_OP = 'UPDATE') THEN
                update artikel set artikel_bestand = artikel_bestand - OLD.lagerbuchung_menge + NEW.lagerbuchung_menge where artikel_id = OLD.lagerbuchung_artikel;
                RETURN OLD;
            ELSIF (TG_OP = 'INSERT') THEN
                IF NEW.lagerbuchung_menge IS NULL THEN
                    RAISE EXCEPTION 'menge cannot be null';
                END IF;
                update artikel set artikel_bestand = artikel_bestand + NEW.lagerbuchung_menge where artikel_id = NEW.lagerbuchung_artikel;
                RETURN NEW;
            END IF;
    END;
    $dbvis$ LANGUAGE plpgsql
    Geändert von frantek (09.11.2011 um 09:21 Uhr)

  4. #4
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von frantek Beitrag anzeigen
    klar kann ich das :-)

    Die Spalten ab "lagerbuchung_text" sind neu, also per "alter table" hinzugef�gt - und jetzt:

    Code:
    matthias@lx-mh ~ $ psql -U lager -W -h server lager_dev
    Passwort f�r Benutzer lager: 
    psql (8.4.9, Server 8.3.14)
    WARNUNG: psql-Version 8.4, Serverversion 8.3.
             Einige Features von psql werden eventuell nicht funktionieren.
    Geben Sie �help� f�r Hilfe ein.
    
    lager_dev=> \d lagerbuchung
                                                    Tabelle �public.lagerbuchung�
            Spalte        |           Typ            |                                 Attribute                                  
    ----------------------+--------------------------+----------------------------------------------------------------------------
     lagerbuchung_id      | bigint                   | not null Vorgabewert nextval('lagerbuchung_lagerbuchung_id_seq'::regclass)
     lagerbuchung_datum   | timestamp with time zone | not null
     lagerbuchung_artikel | bigint                   | not null
     lagerbuchung_menge   | double precision         | not null
     lagerbuchung_text    | character varying(50)    | 
     active               | boolean                  | 
     insby                | bigint                   | 
     modby                | bigint                   | 
     insdate              | timestamp with time zone | 
     moddate              | timestamp with time zone | 
    Indexe:
        "lagerbuchung_pkey" PRIMARY KEY, btree (lagerbuchung_id)
    Fremdschl�ssel-Constraints:
        "lagerbuchung_artikel_fk" FOREIGN KEY (lagerbuchung_artikel) REFERENCES artikel(artikel_id)
    Trigger:
        bestand BEFORE INSERT OR DELETE OR UPDATE ON lagerbuchung FOR EACH ROW EXECUTE PROCEDURE bestand()
    
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    
    lager_dev=> update lagerbuchung set lagerbuchung_text='test', active=true where lagerbuchung_id=18;
    UPDATE 1
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    Und weil es da genau so ist gleich noch mal mit der 9.1.1:

    Code:
    matthias@lx-mh ~ $ psql -U lager -W -h 192.168.100.41 lager_dev
    Passwort für Benutzer lager: 
    psql (8.4.9, Server 9.1.1)
    WARNUNG: psql-Version 8.4, Serverversion 9.1.
             Einige Features von psql werden eventuell nicht funktionieren.
    SSL-Verbindung (Verschlüsselungsmethode: DHE-RSA-AES256-SHA, Bits: 256)
    Geben Sie »help« für Hilfe ein.
    
    lager_dev=> \d lagerbuchung
                                                    Tabelle »public.lagerbuchung«
            Spalte        |           Typ            |                                 Attribute                                  
    ----------------------+--------------------------+----------------------------------------------------------------------------
     lagerbuchung_id      | bigint                   | not null Vorgabewert nextval('lagerbuchung_lagerbuchung_id_seq'::regclass)
     lagerbuchung_datum   | timestamp with time zone | not null
     lagerbuchung_artikel | bigint                   | not null
     lagerbuchung_menge   | double precision         | not null
     lagerbuchung_text    | character varying(50)    | 
     active               | boolean                  | 
     insby                | bigint                   | 
     modby                | bigint                   | 
     insdate              | timestamp with time zone | 
     moddate              | timestamp with time zone | 
    Indexe:
        "lagerbuchung_pkey" PRIMARY KEY, btree (lagerbuchung_id)
    Fremdschlüssel-Constraints:
        "lagerbuchung_artikel_fk" FOREIGN KEY (lagerbuchung_artikel) REFERENCES artikel(artikel_id)
    Trigger:
        bestand BEFORE INSERT OR DELETE OR UPDATE ON lagerbuchung FOR EACH ROW EXECUTE PROCEDURE bestand()
    
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    
    lager_dev=> update lagerbuchung set lagerbuchung_text='test', active=true where lagerbuchung_id=18;
    UPDATE 1
    lager_dev=> select lagerbuchung_id,lagerbuchung_text,active from lagerbuchung where lagerbuchung_id=18;
     lagerbuchung_id | lagerbuchung_text | active 
    -----------------+-------------------+--------
                  18 |                   | 
    (1 Zeile)
    QED ...

    der Vollständigkeit halber:

    Code:
    CREATE OR REPLACE FUNCTION "public"."bestand" ()  RETURNS trigger
      VOLATILE
    AS $dbvis$
    BEGIN
            IF (TG_OP = 'DELETE') THEN
                update artikel set artikel_bestand = artikel_bestand - OLD.lagerbuchung_menge where artikel_id = OLD.lagerbuchung_artikel;
                RETURN OLD;
            ELSIF (TG_OP = 'UPDATE') THEN
                update artikel set artikel_bestand = artikel_bestand - OLD.lagerbuchung_menge + NEW.lagerbuchung_menge where artikel_id = OLD.lagerbuchung_artikel;
                RETURN OLD;
            ELSIF (TG_OP = 'INSERT') THEN
                IF NEW.lagerbuchung_menge IS NULL THEN
                    RAISE EXCEPTION 'menge cannot be null';
                END IF;
                update artikel set artikel_bestand = artikel_bestand + NEW.lagerbuchung_menge where artikel_id = NEW.lagerbuchung_artikel;
                RETURN NEW;
            END IF;
    END;
    $dbvis$ LANGUAGE plpgsql
    Code:
    ELSIF (TG_OP = 'UPDATE') THEN
                update artikel set artikel_bestand = artikel_bestand - OLD.lagerbuchung_menge + NEW.lagerbuchung_menge where artikel_id = OLD.lagerbuchung_artikel;
                RETURN OLD;
    OLD ist der Zustand vor dem Update.


    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

  5. #5
    frantek ist offline Neuer Benutzer
    Registriert seit
    09.11.2011
    Beiträge
    5

    Standard

    Im Trigger wird aber NUR die Tabelle "artiekl" upgedatet und die Update-Zeile passt meiner Meinung nach auch, da ja vom Bestand der im Artikel geführt wird zunächst der Wert vor dem Update abgezogen werden soll und dann der neue Wert addiert werden muss. Das hat meiner Meinung nach nichts mit dem Update von Spalten die in dem Trigger gar nichts benutzt werden zu tun.

  6. #6
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von frantek Beitrag anzeigen
    Im Trigger wird aber NUR die Tabelle "artiekl" upgedatet und die Update-Zeile passt meiner Meinung nach auch, da ja vom Bestand der im Artikel geführt wird zunächst der Wert vor dem Update abgezogen werden soll und dann der neue Wert addiert werden muss. Das hat meiner Meinung nach nichts mit dem Update von Spalten die in dem Trigger gar nichts benutzt werden zu tun.
    Für Dein Logig-Modul mal eine Frage: wozu würde der Return-Wert dienen bzw. was beinhalten, wenn Du im Trigger keine andere Tabelle hättest?


    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

  7. #7
    frantek ist offline Neuer Benutzer
    Registriert seit
    09.11.2011
    Beiträge
    5

    Standard

    danke ... habe es mir dann doch zusammen reimen können, dass Du schreiben wolltest: Beim Update im Trigger ist "RETURN OLD;" falsch, es muss heissen "RETURN NEW;". Ich muss die Doku doch noch mal nach der genauen Funktionsweise der Returnvalues durchschauen ... ich komme von Oracle und da hätte ich für so etwas eine Procedure und keine Function her genommen, gibt es aber in der dezidierten Form in PG nicht so wie ich das sehe.

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

    Standard

    Wenn du "RETURN OLD;" sagst, wird der alte Zustand wiederhergestellt. Als ob es gar keine Änderung gegeben hat.
    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

  9. #9
    frantek ist offline Neuer Benutzer
    Registriert seit
    09.11.2011
    Beiträge
    5

    Standard

    danke, ja, das habe ich eben gelernt ... steht ja so auch in der Doku wie ich eben gesehen habe ... die Sache mit dem Lesen halt ...

Ähnliche Themen

  1. UPDATE in INSERT Abfrage möglich?
    Von truehumandesign im Forum SQL
    Antworten: 16
    Letzter Beitrag: 03.12.2011, 13:14
  2. Antworten: 2
    Letzter Beitrag: 22.05.2009, 21:25
  3. Anmeldung mit phpPgAdmin nach PostreSQL-Update nicht mehr möglich
    Von FrankImGlueck im Forum Installation von PostgreSQL
    Antworten: 4
    Letzter Beitrag: 17.04.2009, 23:00
  4. Hilfe! Kein Backup mehr möglich
    Von Marcus4Aspern im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 13.08.2007, 11:05
  5. Mittels ODCB kein Insert möglich
    Von RASTADISASTA im Forum externe Schnittstellen
    Antworten: 1
    Letzter Beitrag: 06.09.2006, 10:56

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