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” :confused:

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;



CREATE TRIGGER "TBLFAHRTEN_BIO"
BEFORE INSERT
ON TBLFAHRTEN
FOR EACH ROW
EXECUTE PROCEDURE TBLFAHRTEN_BIO();

Die Fehlermeldung, dürfen wir die erraten?

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:

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

ja das ist die Fehlermeldung!!!

danke wie immmer für die schnelle antwort

Es klappt jetzt ich hatte das return vergessen :slight_smile:

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

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;

Nun ja, bau mit RAISE NOTICE ein paar Debuggingmeldungen ein und schau nach, welche Zweige exakt ausgeführt werden.

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

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

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