Ergebnis 1 bis 7 von 7

Thema: Funktion und Trigger können nicht erstellt werden

  1. #1
    Borinator ist offline Neuer Benutzer
    Registriert seit
    20.07.2009
    Beiträge
    11

    Standard Funktion und Trigger können nicht erstellt werden

    Hallo zusammen,

    Ich wollte ein Trigger machen das Tabellenfelder die Null beinhalten durch ein numerisch 0 ersetzt.
    Den Code habe ich dafür, ich hoffe der ist auch richtig.
    Mein Problem liegt darin das, wenn ich die Funktion erstellen will der mir sagt "Trigger existiert nicht". Und wenn ich den Trigger erstellen will sagt der mir "Funktion existiert nicht"
    Code:
    Create FUNCTION "TBLFAHRTEN_BIO"() 
    Returns "Trigger" as
    $BODY$
    BEGIN
        if (New.NR is NULL) then
            New.NR = 0;
    end if;
    end;
    $BODY$
    Language 'plpgsql' VOLATILE;
    Code:
    CREATE TRIGGER "TBLFAHRTEN_BIO"
    BEFORE INSERT
    ON TBLFAHRTEN
    FOR EACH ROW
    EXECUTE PROCEDURE TBLFAHRTEN_BIO();

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

    Standard

    Zitat Zitat von Borinator Beitrag anzeigen
    Hallo zusammen,

    Ich wollte ein Trigger machen das Tabellenfelder die Null beinhalten durch ein numerisch 0 ersetzt.
    Den Code habe ich dafür, ich hoffe der ist auch richtig.
    Mein Problem liegt darin das, wenn ich die Funktion erstellen will der mir sagt "Trigger existiert nicht". Und wenn ich den Trigger erstellen will sagt der mir "Funktion existiert nicht"
    Code:
    Create FUNCTION "TBLFAHRTEN_BIO"() 
    Returns "Trigger" as
    $BODY$
    BEGIN
        if (New.NR is NULL) then
            New.NR = 0;
    end if;
    end;
    $BODY$
    Language 'plpgsql' VOLATILE;
    Code:
    CREATE TRIGGER "TBLFAHRTEN_BIO"
    BEFORE INSERT
    ON TBLFAHRTEN
    FOR EACH ROW
    EXECUTE PROCEDURE TBLFAHRTEN_BIO();

    Die Fehlermeldung, dürfen wir die erraten?

    Code:
    test=*# create table bla(i int);
    CREATE TABLE
    test=*# create or replace function f_bla() returns trigger as $$begin if new.i is null then new.i = 0; return new; end if; end;$$ language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg_bla before insert or update on bla for each row execute procedure f_bla();
    CREATE TRIGGER
    test=*# insert into bla values (NULL);
    INSERT 0 1
    test=*# select * from bla;
     i
    ---
     0
    (1 row)
    
    test=*# rollback;
    works for me, but:

    Code:
    test=*# create table bla(i int);
    CREATE TABLE
    test=*# create or replace function f_bla() returns "Trigger" as $$begin if new.i is null then new.i = 0; return new; end if; end;$$ language plpgsql;
    ERROR:  type "Trigger" does not exist
    Du siehst den Unterschied? Habe ich die Fehlermeldung richtig erraten?


    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
    Borinator ist offline Neuer Benutzer
    Registriert seit
    20.07.2009
    Beiträge
    11

    Standard

    ja das ist die Fehlermeldung!!!

    danke wie immmer für die schnelle antwort

    Es klappt jetzt ich hatte das return vergessen

    Hätte da noch ne Frage. Wenn ich das für ein Feld mache klappt das bestens, sobald ich aber mehrer IF - Anweisungen einbaue, gibt er mir keine Fehlermeldung, aber er bearbeitet nur das erste IF
    Code:
    Create OR REPLACE FUNCTION TBLFAHRTEN_BIO() 
    Returns Trigger
    AS
    $$
    BEGIN
        if New.VONKNOTENNR is NULL then
            New.VONKNOTENNR = 0;
                return new; 
    
              if new.NNR is NULL then
              NEW.NNR = 0;
              return new;
         
            IF new.START IS NULL THEN
                new.START = 0;
                return new; 
    end if;
    end if;
    end if;
    end
    $$
    Language 'plpgsql' VOLATILE;
    Geändert von Borinator (14.08.2009 um 09:28 Uhr)

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

    Standard

    Nun ja, bau mit RAISE NOTICE ein paar Debuggingmeldungen ein und schau nach, welche Zweige exakt ausgeführt werden.
    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

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

    Standard

    Zitat Zitat von Borinator Beitrag anzeigen
    Hallo zusammen,

    Und wenn ich den Trigger erstellen will sagt der mir "Funktion existiert nicht"
    Code:
    Create FUNCTION "TBLFAHRTEN_BIO"() 
    Returns "Trigger" as
    $BODY$
    $BODY$
    Language 'plpgsql' VOLATILE;
    Code:
    CREATE TRIGGER "TBLFAHRTEN_BIO"
    BEFORE INSERT
    ON TBLFAHRTEN
    FOR EACH ROW
    EXECUTE PROCEDURE TBLFAHRTEN_BIO();
    Das is so ein Ding mit den Postgres-Namen /-Symbolen .. da solltest du auch mal die Doku studieren ...

    im grunde ist ein "NAME" nicht gleich NAME oder name ...

    wenn Funktion "NAME" heisst, muss der trigger auch die Funktion "NAME" verwenden - und nicht NAME

    Das mit Trigger existiert nicht hast ja schon rausgefunden .. da trigger bei dir auch in Quotes steht vermutet PG ein Symbol/Typ dahinter - hier wolltest du aber ne Trigger-Funtion definieren und musst demnach das Schluesselwort Trigger ohne Quotes nach dem RETURN verwenden

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

    Standard

    Zitat Zitat von Borinator Beitrag anzeigen
    ja das ist die Fehlermeldung!!!

    danke wie immmer für die schnelle antwort

    Es klappt jetzt ich hatte das return vergessen

    Hätte da noch ne Frage. Wenn ich das für ein Feld mache klappt das bestens, sobald ich aber mehrer IF - Anweisungen einbaue, gibt er mir keine Fehlermeldung, aber er bearbeitet nur das erste IF
    Code:
    Create OR REPLACE FUNCTION TBLFAHRTEN_BIO() 
    Returns Trigger
    AS
    $$
    BEGIN
        if New.VONKNOTENNR is NULL then
            New.VONKNOTENNR = 0;
                return new; 
    
              if new.NNR is NULL then
              NEW.NNR = 0;
              return new;
         
            IF new.START IS NULL THEN
                new.START = 0;
                return new; 
    end if;
    end if;
    end if;
    end
    $$
    Language 'plpgsql' VOLATILE;

    Erstens: Änderungen an Beiträgen sind bäh. Vor allem, wenn man sie inhaltlich ändert. Warum? Das merkt keiner. Ich habe es nur durch die Antwort von ads bemerkt, daß da eine weitere Frage ist. Das war erst nicht. Ändere Beiträge also nicht inhaltlich ab, nutze das nur für z.B. Fipptehler.

    Zweitens: wenn Du mit RETURN NEW aus der Funktion rausgehst, bist Du draußen. Also mache das erst dann, wenn alles abgearbeitet ist, und nicht gleich nach dem ersten Treffer.

    Drittens: was soll das Gedöhns überhaupt? Definiere doch die Felder gleich als NOT NULL.

    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
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Zitat Zitat von Borinator Beitrag anzeigen
    Wenn ich das für ein Feld mache klappt das bestens, sobald ich aber mehrer IF - Anweisungen einbaue, gibt er mir keine Fehlermeldung, aber er bearbeitet nur das erste IF
    Code:
    Create OR REPLACE FUNCTION TBLFAHRTEN_BIO() 
    Returns Trigger
    AS
    $$
    BEGIN
        if New.VONKNOTENNR is NULL then
            New.VONKNOTENNR = 0;
                return new; 
    
              if new.NNR is NULL then
              NEW.NNR = 0;
              return new;
         
            IF new.START IS NULL THEN
                new.START = 0;
                return new; 
    end if;
    end if;
    end if;
    end
    $$
    Language 'plpgsql' VOLATILE;
    is ja auch logisch du hast die ganzen bedingungen ineinander geschachtelt - demnach treffen die nachfolgenden nur ein, wenn alle vorangehenden bedingungen erfuellt sind .. sind keine erfuellt, dann RETURNst du garnix - wodurch die row dann auch nicht inserted wird - also geskippt -> nix passiert

Ähnliche Themen

  1. Frage wofuer werden von postgresql-client eine Menge links in /etc/alternatives erstellt?
    Von mreiter im Forum Installation von PostgreSQL
    Antworten: 1
    Letzter Beitrag: 19.10.2011, 11:54
  2. Frage Wie kann ein Array mittels Domain oder Funktion validiert werden?
    Von jazzhunter im Forum Trigger und Funktionen
    Antworten: 5
    Letzter Beitrag: 26.07.2011, 17:48
  3. RPM-files können nicht heruntergeladen werden
    Von steffenj im Forum Sonstige Installationsprobleme
    Antworten: 3
    Letzter Beitrag: 09.06.2010, 15:34
  4. Antworten: 9
    Letzter Beitrag: 09.10.2008, 13:03
  5. Wir können nicht helfen wenn ...
    Von fristo im Forum Häufig gestellte Fragen (FAQ)
    Antworten: 1
    Letzter Beitrag: 16.11.2007, 07:12

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