2017-05-10 7 views
2

Dokumentation über Triggerprozeduren (https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html) sagt: "Eine Triggerfunktion muss entweder NULL oder einen Datensatz/Zeile zurückgeben".Wann brauchen wir einen Rückgabewert vom Triggerverfahren?

Beispiel

CREATE TRIGGER my_trigger 
AFTER INSERT ON table_name 
FOR EACH ROW EXECUTE PROCEDURE some_trigger_function(); 

Angenommen some_trigger_function() kehrt Datensatz/Zeile, verstand ich, dass Verfahren Körper auf diesem Ereignis aufgerufen und ausgeführt wird, auf diesem Tisch, und so weiter ... aber wo gibt diese Prozedur Wert?

Frage ist: wenn wir diesen zurückgegebenen Wert verwenden? warum haben wir diesen Wert überhaupt gebraucht? Können Sie ein kleines Beispiel geben, das diesen zurückgegebenen Wert verwendet?

Antwort

0

lesen in the documentation:

Triggerfunktionen aufgerufen durch pro-Anweisung Trigger sollte immer return NULL. Trigger-Funktionen, die von Triggern pro Zeile aufgerufen werden, können dem aufrufenden Executor eine Tabellenzeile (einen Wert vom Typ HeapTuple) zurückgeben, wenn sie wählen. Ein Trigger auf Zeilenebene vor einer Operation abgefeuert hat die folgenden Möglichkeiten:

  • Es kann NULL zurückgeben den Vorgang für die aktuelle Zeile zu überspringen. Dies weist den Executor an, die Operation auf Zeilenebene, die den Trigger aufgerufen hat (das Einfügen, Ändern oder Löschen einer bestimmten Tabellenzeile), nicht auszuführen.

  • Nur für INSERT- und UPDATE-Trigger auf Zeilenebene wird die zurückgegebene Zeile zur Zeile, die eingefügt wird, oder ersetzt die Zeile, die aktualisiert ist. Dadurch kann die Triggerfunktion die Zeile ändern, die eingefügt oder aktualisiert ist.

Ein Zeilenebene BEFORE-Trigger, die nicht die Absicht, entweder von diese Verhaltensweisen verursachen müssen vorsichtig sein, die gleiche Zeile als Ergebnis zurückzugeben, die in übergeben wurde (das heißt, die neue Zeile für INSERT und UPDATE löst die OLD-Zeile für DELETE-Trigger aus.

Ein Zeilenebene INSTEAD OF-Trigger sollte entweder NULL zurück um anzuzeigen, dass er keine Daten aus der Sicht der zugrunde liegenden Basis Tabellen ändern hat, oder es sollte die Ansicht Zeile zurück, die für die in (die neuen Reihe übergeben wurde INSERT- und UPDATE-Operationen oder die OLD-Zeile für DELETE Operationen). Ein Nonnull-Rückgabewert wird verwendet, um zu signalisieren, dass der Trigger die notwendigen Datenänderungen in der Ansicht durchgeführt hat. Dies bewirkt, dass die Anzahl der Zeilen, die von dem Befehl betroffen sind, auf erhöht wird. Bei INSERT- und UPDATE-Vorgängen kann der Trigger die Zeile vor dem Zurückgeben ändern. Dies wird die von INSERT RETURNING oder UPDATE RETURNING zurückgegebenen Daten ändern und ist nützlich, wenn die Ansicht nicht genau die gleichen Daten angezeigt, die bereitgestellt wurde.

Der Rückgabewert wird für Trigger auf Zeilenebene ignoriert, die nach einer -Operation ausgelöst wurden, und können daher NULL zurückgeben.

Das folgende Beispiel zeigt, wie in einem Trigger bedingt Insertion abzubrechen:

create table my_table(id int); 

-- do not insert rows with id > 10 
create or replace function before_insert_on_my_table() 
returns trigger language plpgsql as $$ 
begin 
    return case 
     when new.id > 10 then null 
     else new 
    end; 
end $$; 

create trigger before_insert_on_my_table 
before insert on my_table 
for each row execute procedure before_insert_on_my_table(); 

insert into my_table 
values (15), (10), (5), (20) 
returning id; 

id 
---- 
10 
    5 
(2 rows)