2016-12-27 3 views
0

In Postgres-Regeln (https://www.postgresql.org/docs/current/static/sql-createrule.html), ist es möglich, Variablen zu verwenden? Wenn zum Beispiel in der Regel mache ichVerwenden von Variablen in Postgres-Regel

CREATE RULE "_RETURN" AS 
    ON INSERT TO t1 
    DO INSTEAD 
     INSERT INTO t1 (id, a) VALUES (uuid_generate_v4(), new.a) 
     INSERT INTO t4 (id) VALUES (??????) 

Kann ich irgendwie den Wert von uuid_generate_v4() in der ersten INSERT als Variable gesetzt, so dass ich es in der zweiten INSERT verwenden kann? Oder gibt es eine Möglichkeit, die generate ID von der ersten INSERT zu bekommen, damit sie in der zweiten verwendet werden kann?

Auch bekomme ich einen Fehler infinite recursion detected in rules for relation. Wahrscheinlich, weil die Regel für die Tabelle t1 gilt, aber eine Anweisung enthält, die in t1 eingefügt werden soll. Wie kann ich das schaffen?

+0

Ich würde denken, dass Sie wahrscheinlich eine [CTE] (https://www.postgresql.org/docs/9.1/static/queries-with.html) verwenden könnten, um den Uuid-Wert und die Referenz in der Einfügung zu wählen, obwohl es wahrscheinlich andere Wege gibt. Auch Ihre Rekursion kommt höchstwahrscheinlich von der Tatsache, dass Sie bei jeder Einfügung in "t1" eine Regel erstellen, die eine Einfügung in "t1" durchführt, um die Regel erneut auszulösen. – jcern

Antwort

0

Auch bekomme ich einen Fehler unendliche Rekursion in den Regeln für Beziehung gefunden. Wahrscheinlich, weil die Regel für die Tabelle t1 gilt, aber sie enthält eine Anweisung, die in t1 eingefügt werden soll. Wie kann ich diese Arbeit machen

Es kann nicht funktionieren.
Siehe Dokumentation: 39.4. Rules on INSERT, UPDATE, and DELETE

Die Abfrage Bäume aus Regelaktionen erzeugt wird, in denen wieder Rewrite System geworfen, und vielleicht mehr Regeln, was zu mehr oder weniger Abfrage Bäumen erhalten angewandt. So müssen die Aktionen einer Regel entweder einen anderen Befehlstyp oder eine andere Ergebnisbeziehung als die Regel selbst haben, sonst wird dieser rekursive Prozess in einer Endlosschleife enden. (rekursive Erweiterung einer Regel wird erkannt und als Fehler gemeldet.)

Mit anderen Worten, in der Regel ON INSERT TO t1 Sie eine andere insert auf den gleichen Tisch nicht abfeuern können t1, weil diese Ursache, dass die Regel wird rekursiv immer wieder ausgelöst - und dies wird einen Fehler verursachen.

Sie müssen einen Trigger für diese Aufgabe verwenden.

+0

Regel Rekursion beiseite, die Zeile INSERT INTO t1 (ID, a) WERTE (UUID_GENERATE_V4(), neu.a) sollte INSERT INTO t1 (ID, a) WERTE (uuid_generate_v4(), neu.a) Rückgabe id , um den Wert von uuid_generate_v4 zu erhalten –