FEHLER: Record »new« hat noch keinen Wert

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:

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:

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

beim einfügen folgendes Records :

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 > :smiley: > 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ß

Ja, was zahlst?

Okay: in Deinem TRIGGER fehlt ‘for each row’.

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

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

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:

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:

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 :wink:

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

ehemaligerMitarbeiter int primary key,

in der anderen Tabelle

PID bigint REFERENCES Person (PID)

Finde den Unterschied!

select kaffee;

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