2017-11-01 1 views
-1

Ich kann nicht scheinen, logisch zu platzieren, diesen Fehler im Gegensatz zu den meisten produziert gibt wenig bis keine Informationen, warum (in der Regel scheint ihre sehr gute Pre-Prozessoren oder Sie können in die Logik graben, aber hier bekomme ich keine Fehler. ich habe auch eine andere Funktion gut funktioniert, dass diese Schlüssel fügt hinzu, so dass sie das nicht .. andere dann scheint die Transaktion zu scheitern und ich in der Klemme, wenn ichPostgreSQL Trigger-Funktion Update-Fehler

update guest_list set coatcheck = true where ticket_number = 3; 

"PL/pgSQL function coatcheck_gen() line 8 at SQL statement SQL statement "update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number" PL/pgSQL function coatcheck_gen() line 8 at SQL statement SQL statement "update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number"

diese eingeben geht weiter für seiten, endet dann. habe ich ausprobiert benutzt neu. alt. oder nur nummern zu sehen. und nichts. gleicher Fehler alle Tabellen sind in Ordnung. Alle Aktualisierungen funktionieren, wenn sie nur auf Befehl ausgeführt werden. es erscheint an anderer Stelle in den Beispielen seemly richtig ...

die Funktion

create or replace function coatcheck_gen() returns trigger as $gencoatcheck$ 
declare 
coat_num bigint; 
begin 
IF (TG_OP = 'UPDATE') then 
if (new.coatcheck = true) then 
coat_num := (old.frkey_id_event + old.frkey_id_guest); 
update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number; 
return new; 
END IF; 
return new; 
end if; 
return new; 
end; 
$gencoatcheck$ LANGUAGE plpgsql; 

Trigger

create trigger trg_coatchek_gen after update on guest_list for each row when (new.coatcheck = true) execute Procedure coatcheck_gen(); 
+0

Ich habe begreifen nicht ganz ersetzen, was Sie zu achive versuchen. – Ingaz

+0

Sie haben einen 'Trigger nach dem Update für jede Zeile' und innerhalb des Triggers die gleiche Tabelle aktualisiert. Ist es deine wahre Absicht? Wenn es deine Idee war, als was schief gelaufen ist? Sie haben eine Ausnahme in Ihrer Transaktion? Sie haben eine Ausnahme für jede Zeile oder Sie haben keine Ausnahme und es sieht für Sie falsch aus? – Ingaz

+0

yup. Wenn also "Mantelprüfung" auf "Wahr" geändert wird, wird eine Mantelprüfnummer erstellt. und fügt es der Tabelle hinzu. Dies geschieht nur, nachdem eine Person anwesend ist. und auf der Gästeliste. (Funktionen zum Erstellen von Ticketnummern, auf Beiträge von Typ Veranstaltung Arbeit alles gut. Ich habe eine Ausnahme, die versichert, dass eine Person "teilnehmen muss", bevor ein Mantel-Check hinzugefügt wird. also, Trigger tritt auf, wenn und nur wenn "Coatcheck" Ist das passiert, sollte der Trigger auf die Funktion gehen und eine coatcheck_number erstellen .. – Zepalz

Antwort

0

Du eine Endlosschleife zu machen, indem Sie die Tabelle in der Trigger-Aktualisierung. Du rufst es zuerst an und stellst coatcheck = true ein, dann aktualisiert der Trigger die Tabelle erneut, aber seit coatcheck = true wird es erneut vom Trigger verarbeitet (und diese Schleife wird niemals enden).

Sie sould die gesamte Linie

update guest_list set coatcheck_num = coat_num where ticket_number = old.ticket_number; 

von

new.coatcheck_num = coat_num; 

und machen den Auslöser before update

+0

umm oh! ich sehe, was Sie über die Schleife bedeuten. obwohl vorgeschlagene Änderungen. "Fehler: Tupel aktualisiert werden war bereits geändert durch eine Operation, ausgelöst durch den aktuellen Befehl TIPP: Verwenden Sie einen AFTER-Trigger anstelle eines BEFORE-Triggers, um Änderungen an andere Zeilen zu übertragen. ". umm," new.coatcheck_num = coat_num " Fehler: Spalte" neu "von Relation "guest_list" existiert nicht LINE 1: u pdate guest_list set new.coatcheck_num = coat_num wo ti ... – Zepalz

+0

@Zepalz Nein nein, ersetze die ganze Zeile, nicht nur einen Teil davon – JGH

+0

oh oh. Ich verstehe es. Ja, das macht alles einen Sinn. und ja das funktioniert danke. – Zepalz

Verwandte Themen