.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE RULE" "" "2004-06-19" "SQL - 言語" "SQL コマンド"
.SH NAME
CREATE RULE \- 新しい書き換えルールの定義

.SH SYNOPSIS
.sp
.nf
CREATE [ OR REPLACE ] RULE \fIname\fR AS ON \fIevent\fR
    TO \fItable\fR [ WHERE \fIcondition\fR ]
    DO [ INSTEAD ] { NOTHING | \fIcommand\fR | ( \fIcommand\fR ; \fIcommand\fR ... ) }
.sp
.fi
.SH "説明"
.PP
\fBCREATE RULE\fR により、指定したテーブルまたはビューに適用するルールを新しく定義できます。 
\fBCREATE OR REPLACE RULE\fR を使用すると、ルールを新しく作成するか、同じテーブルの同じ名前の既存ルールを置き換えるかのいずれかを実行します。
.PP
PostgreSQLのルールシステムによって、データベーステーブルの挿入、更新、削除の代替として行われるアクションを定義することができます。
大雑把にいうと、指定されたテーブルに指定されたコマンドが実行された時に、ルールによって実行されるコマンドが追加されます。
その他にも、ルールによって、指定されたコマンドを他のコマンドに置き換えることも、まったくコマンドを実行させないようにすることも可能です。
ルールはテーブルビューを実装するためにも使われます。
ルールは本当にコマンドを変換する機構、もしくは、コマンドマクロであることを認識することが重要です。
この変換はコマンドの実行が始まる前に発生します。
実際に各物理行に独立した操作を行いたい場合、おそらくルールではなくトリガを使用することでしょう。
ルールシステムについてのより詳細は、[XRef to RULES] に記載されています。
.PP
現時点では、ON SELECTルールは無条件のINSTEADルールでなければならず、単一\fBSELECT\fRコマンドで成り立つアクションを持っていなければなりません。
このようにして、ON SELECT ルールはテーブルを効果的にビューに変え、そのビューの可視的な内容は （もしあったとしても） テーブル内に格納されているものではなく、ルールの \fBSELECT\fR コマンドによって返された行です。
実際のテーブルを作成しそれにON SELECTルールを定義するよりは \fBCREATE VIEW\fRコマンドを書く方がよい形式とされています。
.PP
ON INSERT、ON UPDATE、ON DELETE ルール(もしくは、目的に応じてこのうちの一部)を定義して、ビューへの更新操作を他のテーブルへの適切な更新操作に置換することで、更新可能なビューという幻を作成することができます。 
.PP
ビューの更新の際に条件付きルールの使用を予定している場合、罠があります。
そのビューに許可したい操作それぞれに無条件 INSTEAD ルールを用意する \fB必要\fRがあることです。
ルールが条件付き、または、INSTEAD ではない場合、システムは更新操作の試行を拒絶します。 
その場合、ある条件でビューのダミーテーブルへの操作を行なうことになるとシステムがみなすからです。
条件付きルール内で全ての使用し得るケースを扱うのであれば、無条件の DO INSTEAD NOTHING ルールを追加し、システムにダミーテーブルへの更新を行なうことが決してないことを理解させることで、それを実現することができます。
さらに、INSTEAD でない条件付きルールを作成します。 
これらが起動される条件では、デフォルトのINSTEAD NOTHING 動作に追加されます。
.SH "パラメータ"
.TP
\fB\fIname\fB\fR
作成するルールの名前です。 
この名前は、同じテーブルの他のルールとは異なる名前にする必要があります。
複数の同一テーブル、同一イベント種類のルールがあった場合、その名前のアルファベット順で適用されます。
.TP
\fB\fIevent\fB\fR
イベントとは、SELECT、INSERT、UPDATE、DELETEのいずれかです。
.TP
\fB\fItable\fB\fR
ルールを適用するテーブルまたはビューの名前です (スキーマ修飾名でも可)。
.TP
\fB\fIcondition\fB\fR
任意の SQL 条件式です (\fBboolean\fR 型を返します)。 
条件式では、new および old 以外は、どのテーブルも参照できません。
また、集約関数を含めることもできません。
.TP
\fB\fIcommand\fB\fR
ルールのアクションを構成する単数または複数のコマンドです。
有効なコマンドは SELECT、INSERT、UPDATE、DELETE、NOTIFY文です。
.PP
\fIcondition\fR と \fIcommand\fR の内部では、特別なテーブル名 NEW と OLD は参照されるテーブルの値を参照するために使用できます。
NEW は、ON INSERT と ON UPDATE ルールで、挿入または更新されている新しい行を参照するのに有効です。 
OLD は、ON UPDATE と ON DELETE ルールで、更新または削除されている既存の行を参照するのに有効です。
.PP
.SH "注釈"
.PP
テーブルにルールを定義するためには RULE 権限が必要です。
.PP
循環ルールを避けるために注意を払うことはとても重要です。
たとえば、下記の2つのルールそれぞれがPostgreSQLに受け入れられた場合、\fBSELECT\fRコマンドは、問い合わせが何度も循環しすぎたためにPostgreSQLにエラーを表示させます。
.sp
.nf
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;
.sp
.fi
.PP
現在、ルールが \fBNOTIFY\fR 問い合わせを含む場合、\fBNOTIFY\fR は無条件に実行されます。 
つまり、ルールを適用すべき行が存在しなかったとしても、\fBNOTIFY\fR は発行されます。
例えば、
.sp
.nf
CREATE RULE notify_me AS ON UPDATE TO mytable DO NOTIFY mytable;

UPDATE mytable SET name = 'foo' WHERE id = 42;
.sp
.fi
では、id = 42を持つ行があってもなくても、1つの\fBNOTIFY\fRイベントが\fBUPDATE\fRの際に送信されます。
これは実装上の制限であり、将来のリリースでは修正されるかもしれません。
.SH "互換性"
.PP
ルールシステム全体同様、\fBCREATE RULE\fR は PostgreSQL の言語拡張です。
