Funktion in INSERT-Regel und RETURNING

Liebe Leut’,

ich hänge fest bei dem folgenden Versuch:

Gegeben zwei Tabellen mit einer optionalen 1-1-Beziehung, dazu ein View, der sie zusammenführt. Das soll ein updatable View werden, und die Regel für INSERT soll die RETURNING-Klausel unterstützen.

Also muss es eine INSTEAD-Regel ohne Bedingungen sein. Das heißt aber, dass innerhalb der Regel-Aktion geklärt werden muss, ob ein Satz für die zweite der beiden Tabellen nötig ist oder nicht (meistens ist er nicht nötig). Das wieder heißt, dass die Regel eine Funktion ausführen muss, in der diese Fallunterscheidung erfolgt. So weit alles schön und gut; die Regel lautet jetzt:

CREATE OR REPLACE RULE r_betrag_ins AS
ON INSERT TO v_ausgaben DO INSTEAD SELECT ausg_ins(new.*) AS ausg_ins;

Ein INSERT ohne RETURNING klappt mit dieser Regel, ein “INSERT … RETURNING ausg_id” führt zur Fehlermeldung:
FEHLER: INSERT RETURNING kann in Relation »v_ausgaben« nicht ausgeführt werden
HINT: Sie benötigen eine ON INSERT DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel.

Jetzt die Frage: wie bekomme ich eine korrekte RETURNING-Klausel in meine Regel hinein? Einfach anhängen gibt einen Syntaxfehler. Das Beispiel in der Dokumentation hat SQL-Anweisungen in der Regel, keinen Funktionsaufruf.

Die Funktion gibt den neu vergebenen Primärschlüssel zurück, aber das allein scheint nicht der Punkt zu sein.

Mache ich was falsch (hoffentlich) oder geht das nicht, was ich möchte?

Ich komme zu dem Schluss, dass dazu niemandem etwas einfällt. Einigen Diskussionen in der englischsprachigen Mailingliste entnehme ich, dass das Erzeugen editierbarer Views mit Regeln generell seine Tücken hat. Mir sind zwei Auswege eingefallen (allerdings noch nicht getestet):

a) Gewöhnliche INSERT-RETURNING-Anweisungen in der Regel und ein BEFORE-INSERT-Trigger für Tabelle Nr. 2, der bei Bedarf die Eingabe verhindert. Relativ doof im gegebenen Fall, in dem nur in seltenen Ausnahmefällen etwas in die zweite Tabelle hinein muss. Bedeutet außerdem, dass einem der Werte für die zweite Tabelle (und nicht einem anderen Feld des Views) anzusehen sein muss, ob der neue Satz wirklich eingefügt werden soll.

b) Die Funktion, die jetzt in der Regel ausgeführt wird, direkt aus der Anwendung heraus ausführen lassen und ihren Rückgabewert dort abfragen und benutzen. “Die Anwendung” statt des Datenbanksystems arbeiten zu lassen riecht mir nach MySQL, ist aber in diesem Ausnahmefall vielleicht vertretbar.

Ich sollte noch dazu sagen, dass das ganze Zeug winzig klein und nur für meinen eigenen Gebrauch gedacht ist. Trotzdem muss man ja nicht herummurksen. Hat jemand einen Kommentar zu den angedachten Auswegen?

Und: habe ich die Frage blöd gestellt? Oder sollte ich doch lieber auf eine der englischsprachigen Mailinglisten umsteigen, einfach wg. mehr Teilnehmern?