CREATE RULE name AS ON event TO object [ WHERE condition ] DO [ INSTEAD ] action where action can be: NOTHING | query | ( query ; query ... ) | [ query ; query ... ]
作成するルールの名前です。
イベントとは SELECT、 UPDATE、 DELETE INSERT のどれかです。
オブジェクトとは table または table.column のいずれかです。 ( 現時点ではtable フォームのみが実際に実装されています。)
任意のブーリアン条件式です。条件式は new と old 以外のどのテーブルを参照することも できません。
action を構成する 単数または複数の問い合わせは任意の SQL SELECT、 INSERT、 UPDATE、 DELETE、または NOTIFY 文のどれでも構いません。
condition と action のうちでは 特別なテーブル名 new と old は参照される テーブル (object) の値を参照するために使うことができます。 new は ON INSERT と ON UPDATE ルール内で 挿入または更新されている新しい行の参照に有効です。 old は ON SELECT、ON UPDATE、そして ON DELETE ルールが選択、更新、または削除されている既存の 行を参照するのに有効です。
Postgres ルールシステムはデータベーステーブルの 挿入、更新、または削除の代替として行なわれるアクション を定義することを許可します。ルールはテーブルビューを実装する ためにも使われます。
ルールの語義は個別のインスタンス(行)がアクセスされ、挿入、更新、 または削除される場合、(選択、更新そして削除の対象となる) 古い インスタンスと、(更新と追加の対象となる)新しいインスタンスが 存在するということです。与えられたイベント型と目的のオブジェクト (テーブル)の全てのルールは、特定されない順番で審査されます。 WHERE 句(あった場合)で指定された condition が真である場合、そのルールの action 部分が 実行されます。INSTEAD が指定されると、もとの問い合わせの代わりに action が行なわれます。 そうでない場合はもとの問い合わせが実行される前に行なわれます。 condition と action の両方の なかで、古いインスタンスあるいは新しいインスタンスの中のフィールド の値は old.attribute-name と new.attribute-name で入れ換えられます。
ルールの action 部分 は一つ以上の問い合わせで作ることができます。複数の問い合わせを書くため には、カッコまたは角カッコで囲みます。そのような問い合わせは 指定された順番で実行されます(一方、オブジェクトの複数ルールの実行 順番には何も保障がありません)。 action は動作が何も ないことを示すために NOTHING を使うこともできます。したがって、 DO INSTEAD NOTHING ルールはもとの問い合わせを実行しないように 抑制します。DO NOTHING ルールは役立ちません。
ルールの action 部分は動作を促したユーザコマンドと同じコマンドとトランザクション 識別子を実行します。
現時点では、ON SELECT ルールは無条件の INSTEAD ルールでなければならず、 単一 SELECT 問い合わせで成り立つアクションを持っていなければなりません。 したがって、ON SELECT ルールはオブジェクトテーブルを効果的にビュー に変え、このビューの可視内容はテーブルに格納されたものが何でも 返されるわけではなく(もしあれば)ルールの SELECT 問い合わせに返される 行です。テーブルを作成しそれに ON SELECT ルールを定義するよりは CREATE VIEW コマンドを書く方が良い形式とされています。
テーブルにルールを定義するためにはルール定義アクセス権を 持っていなければなりません。権限を変えるには GRANT と REVOKE を使います。
循環ルールを避けるために注意を払うことはとても重要です。 例えば、下記の二つのルール各々が Postgres に受け入れられた場合、SELECT コマンドは、問い合わせが 何度も循環しすぎたために Postgres にエラーを表示させます。
Example 1. 循環リライトルールコンビネーションの例
CREATE RULE bad_rule_combination_1 AS ON SELECT TO emp DO INSTEAD SELECT * FROM toyemp;
CREATE RULE bad_rule_combination_2 AS ON SELECT TO toyemp DO INSTEAD SELECT * FROM emp;
この EMP から選択しようという試みは、問い合わせが何度も 循環しすぎたために Postgres にエラーを発行 させます。
SELECT * FROM emp;