FEHLER: Record »new« hat noch keinen Wert

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
Kasperdelasopa
Neuer Benutzer
Beiträge: 4
Registriert: Do 18. Okt 2012, 13:15

FEHLER: Record »new« hat noch keinen Wert

Beitrag von Kasperdelasopa » Do 18. Okt 2012, 13:24

Hallo,
Ich bin neu im Postgres Umfeld und habe für mein Problem in der Postgres Doku nix gefunden.
Ich möchte einen Trigger auf einer Tabelle haben um zu prüfen ob die Zeile die Eingefügt werden soll gültig ist:

folgender maßen habe ich die Function gemacht:

Code: Alles auswählen

create or replace function f_trigg_ereig2() returns trigger as $$
declare
fnr Integer;
mannr integer;
del integer;
Begin
    select 0 into del;
    select MNr from Einsatz where ENr = NEW.ENr into mannr;
    select FNr from Einsatz where FNr = NEW.FNr into fnr;
       

    IF  mannr IS NOT NULL THEN
        RAISE EXCEPTION 'Manschaft am Einsatz schon beteiligt' ;
        Return NULL;
    END IF ;
   
    IF  fnr IS NOT NULL THEN
        RAISE EXCEPTION 'Fahrzeug am Einsatz schon beteiligt';
        Return NULL;
    END IF ;

    RETURN NEW;

END;
$$ LANGUAGE plpgsql ;


den trigger folgendermaßen:

Code: Alles auswählen

create trigger trigg_einsatz before insert on Einsatz
    execute PROCEDURE f_trigg_ereig2();


beim einfügen folgendes Records :

Code: Alles auswählen

insert into Einsatz values( 1, 10, 10);


bekomme ich folgende Fehlermeldung :
FEHLER: Record »new« hat noch keinen Wert
DETAIL: Die Tupelstruktur eines Records ohne Wert ist unbestimmt.
CONTEXT: SQL statement "select MNr from Einsatz where ENr = NEW.ENr"
PL/pgSQL-Funktion »f_trigg_ereig2« Zeile 8 bei SQL-Anweisung

********** Fehler **********

FEHLER: Record »new« hat noch keinen Wert
SQL Status:55000
Detail :D ie Tupelstruktur eines Records ohne Wert ist unbestimmt.
Kontext:SQL statement "select MNr from Einsatz where ENr = NEW.ENr"
PL/pgSQL-Funktion »f_trigg_ereig2« Zeile 8 bei SQL-Anweisung


Kann mir jemand sagen was ich da falsch gemacht habe?

Gruß

akretschmer
Erfahrener Benutzer
Beiträge: 7480
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Do 18. Okt 2012, 13:35

Kasperdelasopa hat geschrieben:

Kann mir jemand sagen was ich da falsch gemacht habe?

Gruß


Ja, was zahlst?

Okay: in Deinem TRIGGER fehlt 'for each row'.

Code: Alles auswählen

test=# create or replace function insert_t() returns trigger as $$declare my_a int; begin select a from t1 where a=new.a into my_a;return new; end;$$language plpgsql;
CREATE FUNCTION
Time: 0,402 ms
test=*# create trigger trg_a1 before insert on t  execute procedure insert_t();
CREATE TRIGGER
Time: 0,301 ms
test=*# insert into t values (1);
ERROR:  record "new" is not assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT:  SQL statement "select a from t1 where a=new.a"
PL/pgSQL function insert_t() line 1 at SQL statement
Time: 0,515 ms
test=*#
test=*#
test=*# rollback;
ROLLBACK
Time: 0,245 ms
test=# create or replace function insert_t() returns trigger as $$declare my_a int; begin select a from t1 where a=new.a into my_a;return new; end;$$language plpgsql;
CREATE FUNCTION
Time: 0,619 ms
test=*# create trigger trg_a1 before insert on t for each row execute procedure insert_t();
CREATE TRIGGER
Time: 0,443 ms
test=*# insert into t values (1);
INSERT 0 1
Time: 0,564 ms
test=*#



Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7480
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Do 18. Okt 2012, 13:39

akretschmer hat geschrieben:Ja, was zahlst?



Um die Frage mal zu beantworten: Performance und so, weil, der Check im Trigger würde auch mit passenden Indexen gehen. Und zwar schneller.


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Lilith
Neuer Benutzer
Beiträge: 2
Registriert: Mi 8. Jun 2016, 21:03

Re: FEHLER: Record »new« hat noch keinen Wert

Beitrag von Lilith » Mi 8. Jun 2016, 21:35

HAHA XD schreibe einen Hilfe-Ruf in ein Forum, und bevor du ihn Abschickst, geht es von allein XD
Naja Jetzt hab ich trotzdem etwas böldes: :rolleyes: Hoffe mir kann Jemand helfen

Ich habe folgende Tabelle, auf die der Trigger bei DELETE reagieren soll:

Code: Alles auswählen

CREATE TABLE Person_workAt_Company (
  PID 		bigint 	REFERENCES Person (PID)
			ON DELETE CASCADE 
			ON UPDATE CASCADE NOT NULL,
  companyID 	bigint 	REFERENCES Company (companyID)
			ON DELETE CASCADE 
			ON UPDATE CASCADE NOT NULL,
  workFrom 	int 	DEFAULT NULL,
 PRIMARY KEY (PID,companyID)
); 
Mein Trigger/-funktion schaut ao aus:

Code: Alles auswählen

CREATE or REPLACE FUNCTION MitarbeiterEntlassen() RETURNS TRIGGER AS $_$
BEGIN
  RAISE NOTICE 'Trigger an';
  CREATE TABLE IF NOT EXISTS EntlassenePersonen(
      ehemaligerMitarbeiter int primary key,
      entlassungsDatum timestamp);
      
  INSERT INTO EntlassenePersonen (ehemaligerMitarbeiter, entlassungsDatum) VALUES (OLD.PID,current_timestamp);
RETURN OLD;
END; $_$ LANGUAGE 'plpgsql';

CREATE TRIGGER Entlassen 
BEFORE DELETE ON person_workat_company
FOR EACH ROW 
EXECUTE PROCEDURE MitarbeiterEntlassen();
Ziel ist es eine BackUp Tabelle zu erzeugen, die die gelöschten Mitarbeiter und das "entlassungsdatum" speichert, sowie den Mitarbeiter halt aus der Tabelle zu entfernen ;)

Wenn ich nun ein Bsp lösche bekomme ich folgende Meldung: "FEHLER: integer ist außerhalb des gültigen Bereichs"
was mich daran irritiert:
z.B. pid=94 kein Problem
bei pid=2199023255565 Mault der rum. Dabei sind die daten schon in der workAt-Tabelle als bigint (wie auch in der erzeugten "backup tabelle").


Kann mir Jemand sagen, wo ich hinschielen muss, dass das funktioniert oO

akretschmer
Erfahrener Benutzer
Beiträge: 7480
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: FEHLER: Record »new« hat noch keinen Wert

Beitrag von akretschmer » Do 9. Jun 2016, 06:06

ehemaligerMitarbeiter int primary key,

in der anderen Tabelle

PID bigint REFERENCES Person (PID)

Finde den Unterschied!

select kaffee;
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Lilith
Neuer Benutzer
Beiträge: 2
Registriert: Mi 8. Jun 2016, 21:03

Re: FEHLER: Record »new« hat noch keinen Wert

Beitrag von Lilith » Do 9. Jun 2016, 14:17

Danke, habs auch schon gesehen, war doch schon spät gestern -.-'

Antworten