CREATE RULE

Name

CREATE RULE -- definiert eine neue Umschreiberegel

Synopsis

CREATE [ OR REPLACE ] RULE name AS ON ereignis
    TO tabelle [ WHERE bedingung ]
    DO [ INSTEAD ] { NOTHING | befehl | ( befehl ; befehl ... ) }

Beschreibung

CREATE RULE definiert eine neue Regel für die angegebene Tabelle oder Sicht. CREATE OR REPLACE RULE erzeugt entweder eine neue Regel oder ersetzt eine bestehende Regel mit dem selben Namen für die selbe Tabelle oder Sicht.

Mit dem PostgreSQL-Regelnsystem kann man alternative Aktionen definieren, die bei bestimmten Einfüge-, Aktualisierungs- und Löschoperationen in Datenbanktabellen durchgeführt werden. Grob gesagt sorgt eine Regel dafür, dass zusätzliche Befehle ausgeführt werden, wenn ein bestimmter Befehl in einer bestimmten Tabelle ausgeführt wird. Als Alternative kann eine Regel auch einen Befehl durch einen anderen ersetzen oder dafür sorgen, dass ein Befehl gar nicht ausgeführt wird. Regeln werden auch zur Implementierung von Sichten verwendet. Wichtig dabei ist, dass eine Regel ein Transformationsmechanismus für Befehle, oder ein Befehlsmakro, ist. Die Transformation passiert, bevor die Ausführung des Befehls anfängt. Wenn Sie wollen, dass eine Operation unabhängig für jede Zeile ausgeführt wird, dann sollten Sie wohl eher einen Trigger als eine Regel verwenden. Weitere Informationen über das Regelnsystem finden Sie in Kapitel 36.

Gegenwärtig müssen ON SELECT-Regeln INSTEAD sein, dürfen keine Bedingung haben und müssen einen einzelnen SELECT-Befehl als Aktion haben. Eine ON SELECT-Regel macht also aus einer Tabelle im Prinzip eine Sicht, deren sichtbarer Inhalt die vom SELECT-Befehl zurückgegebenen Zeilen sind, anstatt der eigentliche Inhalt der Tabelle. Es ist aber besserer Stil, den Befehl CREATE VIEW zur Erzeugung von Sichten zu verwenden, anstatt eine richtige Tabelle zu erzeugen und dann dafür eine ON SELECT-Regel zu definieren.

Sie können die Illusion einer aktualisierbaren Sicht erzeugen, indem Sie für eine Sicht Regeln für ON INSERT, ON UPDATE und ON DELETE (oder nur die, die Sie benötigen) erzeugen um für diese Aktionen die entsprechenden Aktionen in anderen Tabellen zu ersetzen.

Wenn Sie Regeln mit Bedingungen für die Aktualisierung von Sichten verwenden, dann gibt es einen Haken: Es muss für jede Aktion, die Sie für die Sicht erlauben wollen, eine Regel ohne Bedingung und mit INSTEAD geben. Wenn die Regel eine Bedingung hat oder nicht INSTEAD ist, dann wird das System alle Versuche, die Aktion durchzuführen, ablehnen, weil es denkt, dass es eventuell dazu kommen könnte, dass die Aktion direkt in der Sicht ausgeführt werden wird, was nicht geht. Wenn Regeln mit Bedingung trotzdem für Sie am sinnvollsten sind, dann können Sie sie nichtsdestotrotz verwenden; erzeugen Sie einfache eine DO INSTEAD NOTHING-Regel ohne Bedingung, damit das System versteht, dass es niemals eine Aktualisierung direkt in der Sicht vornehmen muss. Die Regeln mit Bedingungen definieren Sie dann ohne INSTEAD; wenn sie angewendet werden, dann wird der ursprüngliche Befehl durch DO INSTEAD NOTHING ersetzt.

Parameter

name

Der Name der zu erzeugenden Regel. Der Name muss sich von den Namen aller Regeln in der selben Tabelle unterscheiden. Wenn es mehrere Regeln für eine Tabelle und einen Ereignistyp gibt, dann werden Sie in alphabetischer Reihenfolge ihrem Namen nach angewendet.

ereignis

Das Ereignis ist SELECT, INSERT, UPDATE oder DELETE.

tabelle

Der Name der Tabelle oder der Sicht (möglicherweise mit Schemaqualifikation), für die die Regel gilt.

bedingung

Ein Bedingungsausdruck (Ergebnistyp boolean). Der Bedingungsausdruck kann nur auf die Tabellen NEW und OLD verweisen und darf keine Aggregatfunktionen enthalten.

befehl

Der Befehl oder die Befehle, die die Regelaktion darstellen. Gültige Befehle sind SELECT, INSERT, UPDATE, DELETE oder NOTIFY. Wenn Sie anstatt eines Befehls NOTHING schreiben, dann wird der ursprüngliche Befehl durch „nichts“ ersetzt, also verworfen.

Innerhalb von bedingung und befehl können die besonderen Tabellennamen NEW und OLD verwendet werden um auf die Tabelle, zu der die Regel gehört, zu verweisen. NEW kann in ON INSERT- und ON UPDATE-Regeln verwendet werden und verweist auf die einzufügende bzw. die aktualisierte Zeile. OLD kann in ON UPDATE- und ON DELETE-Regeln verwendet werden und verweist auf die bestehende Zeile, die zu aktualisieren bzw. zu löschen ist.

Meldungen

CREATE RULE

Meldung, wenn die Regel erfolgreich erzeugt wurde.

Hinweise

Um eine Regel definieren zu können, müssen Sie für die betroffene Tabelle das Privileg RULE haben.

Es ist wichtig, rekursive Regeldefinitionen zu vermeiden. Die folgenden beiden Regeldefinitionen zum Beispiel werden zwar von PostgreSQL angenommen, aber der SELECT-Befehl würde einen Fehler verursachen, weil die Anfrage zu oft rekursiv aufgerufen wurde:

CREATE RULE "_RETURN" AS
    ON SELECT TO t1
    DO INSTEAD 
	SELECT * FROM t2;

CREATE RULE "_RETURN" AS
    ON SELECT TO t2
    DO INSTEAD 
	SELECT * FROM t1;

SELECT * FROM t1;

Wenn eine Regelaktion einen NOTIFY-Befehl enthält, dann wird der NOTIFY-Befehl gegenwärtig bedingungslos ausgeführt. Das heißt, der NOTIFY-Befehl wird selbst dann ausgeführt, wenn es keine Zeilen gibt, für die die Regel angewendet werden kann. Zum Beispiel würde bei

CREATE RULE notify_test AS ON UPDATE TO meine_tabelle DO NOTIFY meine_tabelle;

UPDATE meine_tabelle SET name = 'foo' WHERE id = 42;

während eines UPDATE ein NOTIFY-Ereignis gesendet, egal ob es Zeilen mit id = 42 gibt. Der Grund dieser Einschränkung liegt in der Implementierung. In der Zukunft sollte dieser Fehler berichtigt werden.

Kompatibilität

Der Befehl CREATE RULE ist eine PostgreSQL-Erweiterung, wie das gesamte Regelnsystem.

Siehe Auch

DROP RULE