2016-04-26 15 views
1

Ich versuche, Werte in eine Tabelle einzufügen, die auf einer Person basiert, die in eine andere Tabelle eingefügt wird. Ich habe einen Auslöser dafür, wenn jemand einem Mitarbeiter zugewiesen wird, werden sie automatisch mit employeepark mit der ersten Stelle, die verfügbar ist, zugewiesen. Ich kann nicht herausfinden, wie man auf die ID zugreift, die in die employee-Tabelle eingegeben wird. Ich würde mich über irgendwelche Tipps oder Ideen freuen, danke!gespeicherte Prozedur, Zugriff auf gerade eingefügte Daten

Dies ist der Fehler, den ich erhalte.

ERROR: record "new" is not assigned yet 
 
create or replace function new_employeeAssign() returns trigger as $new_employeeAssign$ 
declare 
    open_spotID int := (select parkingspot.spotid 
         from employeepark e full outer join parkingspot on e.spotid = parkingspot.spotid 
         where e.spotid isNull limit 1); 
begin 
    insert into employeepark(employeeid, spotid) 
     values(new.employeeid ,open_spotID); 
End; 
$new_employeeAssign$ language plpgsql; 

create trigger new_employeeAssign after insert on employee 
    execute procedure new_employeeAssign(); 

insert into people(peopleid, fname, lname) 
    values(686, 'random', 'person'); 
insert into employee(employeeid) 
    values(686); 

Patrick dachte das jetzt für mich heraus, dass ich in leite dieses Problem: ich den ersten Wert aus allen dieser Bereiche auswählen möchten, die null ist, ich bekomme immer wieder ein, obwohl und es ist nur umgangen die Bereiche und direkt zum isNull.

 
    (select parkingspot.spotid 
    from employeepark e full outer join parkingspot on e.spotid =  parkingspot.spotid 
    where (e.spotid = 301) 
    or (e.spotid = 1601) 
    or (e.spotid = 2001) 
    or (e.spotid = 2011) 
    or (e.spotid = 2121) 
    or (e.spotid = 2021) 
    or (e.spotid = 2771) 
    or (e.spotid = 2921) 
    or (e.spotid = 3021) 
    or (e.spotid = 3823) isNull 
    limit 1) 

Antwort

2

Ihre Triggerdefinition ist falsch. Standardmäßig gilt ein Trigger für FOR EACH STATEMENT und dann der NEW Parameter nicht vorhanden (der Trigger gilt schließlich nicht für eine Zeile). Stattdessen sollten Sie haben:

CREATE TRIGGER new_employeeAssign AFTER INSERT ON employee 
FOR EACH ROW EXECUTE PROCEDURE new_employeeAssign(); 

Es gibt auch einige Probleme mit der Trigger-Funktion, insbesondere die Abfrage, die auf variable open_spotID zuweist. Diese Abfrage wählt immer NULL, da e.spotid IS NULL und Sie auf e.spotid = parkingspot.spotid beitreten. Die Logik, die Sie suchen, ist wahrscheinlich, dass Sie einem neuen Mitarbeiter eine Parklücke zuweisen möchten, indem Sie eine Zeile in der Tabelle mit einer erstellen, die noch keinem anderen Mitarbeiter zugewiesen ist. Siehe Code unten.

Sie müssen auch RETURN NEW von der Funktion.

Other than that, Ihre Trigger-Funktion ähnlich wie so optimiert werden könnte:

CREATE FUNCTION new_employeeAssign() RETURNS trigger AS $new_employeeAssign$ 
BEGIN 
    INSERT INTO employeepark(employeeid, spotid) 
     SELECT NEW.employeeid, spotid 
     FROM parkingspot p 
     LEFT JOIN employeepark e USING (spotid) 
     WHERE e.employeeid IS NULL 
     LIMIT 1; 
    RETURN NEW; 
END; 
$new_employeeAssign$ LANGUAGE plpgsql; 
+0

parkingspot eine andere Tabelle, wenn ich laufe, dass Auswahlabfrage ich die nächste verfügbare Parklücke zu bekommen (ich es einfach versucht) .. Ich bekomme einen Fehler, weil die new.employeeid in der Insert-Anweisung nicht auf den Wert, der gerade in Mitarbeiter @Patrick – Zeke

+1

eingegeben wurde Problem ist in Trigger-Definition, die für jede Zeile sein sollte. Siehe aktualisierte Antwort. – Patrick

+0

Ich muss den ersten Wert in diesen Bereichen, die Null ist, die 600 wäre, zurückgeben, aber ich bekomme immer einen .. ignoriert die Bereiche ... irgendwelche Tipps? @Patrick – Zeke