.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE TRIGGER" "" "2003-08-02" "SQL - 言語" "SQL コマンド"
.SH NAME
CREATE TRIGGER \- 新しいトリガの定義
.SH SYNOPSIS
.sp
.nf
CREATE TRIGGER \fIname\fR { BEFORE | AFTER } { \fIevent\fR [OR ...] }
    ON \fItable\fR FOR EACH { ROW | STATEMENT }
    EXECUTE PROCEDURE \fIfunc\fR ( \fIarguments\fR )
  
.sp
.fi
.SS "入力"
.PP
.TP
\fB\fIname\fB\fR
新しいトリガに付与する名前です。 この名前は、同じテーブルの他のトリガとは異なる名前にする必要があります。
.TP
\fB\fIevent\fB\fR
INSERT、 DELETE または UPDATE のどれかです。
.TP
\fB\fItable\fB\fR
トリガを作成するテーブルの名前です (スキーマ修飾名でも可)。
.TP
\fB\fIfunc\fB\fR
引数を持たず、trigger 型を返すよう宣言された、ユーザが提供する関数です。
.TP
\fB\fIarguments\fB\fR
トリガ実行時に、新旧のタプル内容のような標準トリガデータとともに関数に渡される、複数の引数をコンマで区切ったリストです (省略可能)。 引数は、リテラル文字列定数です。 単純な名前および数値定数もここに記述できますが、すべて文字列に変換されます。
.PP
.SS "出力"
.PP
.TP
\fBCREATE TRIGGER\fR
トリガの作成に成功した場合に返されるメッセージです。
.PP
.SH "説明"
.PP
\fBCREATE TRIGGER\fR は新しいトリガを現在のデータベースに登録します。そのトリガはリレーション \fItable\fR と関連づけられ指定された関数 \fIfunc\fRを実行します。
.PP
トリガは、タプルへの操作が開始される前(制約条件のチェックと \fBINSERT\fR、\fBUPDATE\fR または \fBDELETE\fR が行われる前)、あるいは操作が開始された後(制約条件がチェックされ \fBINSERT\fR、\fBUPDATE\fR または \fBDELETE\fR が完了した後) の前後いずれでも起動を指定することができます。イベントの前にトリガが起動すると、そのトリガは指定したタプルに対する操作を省略することも、(\fBINSERT\fR と \fBUPDATE\fR の操作時のみ) 挿入されたタプルを変更することもできます。イベントの後にトリガが起動すると、最終の挿入、更新あるいは削除を含んだ全ての変更がトリガに``可視''となります。
.PP
同じ種類の複数のトリガが同一イベントに定義された場合、名前のアルファベット順で実行されます。
.PP
\fBSELECT\fR は行を全く変更しませんので、\fBSELECT\fR トリガを作成することはできません。この場合は、ルールやビューの方がより適しています。
.PP
より詳細については、\fIPostgreSQL プログラマガイド\fR の SPI と トリガの章を参照して下さい。
.SH "注釈"
.PP
テーブルにトリガを作成するには、ユーザはそのテーブルに対し TRIGGER 権限を持つ必要があります。
.PP
PostgreSQL 7.3 より前のバージョンでは、トリガ関数を \fBtrigger\fR 型ではなくプレースホルダ型 \fBopaque\fR 型を返すように宣言する必要がありました。 古いダンプファイルのロードをサポートするため、\fBCREATE TRIGGER\fR では \fBopaque\fR 型を返すよう宣言された関数を受け入れます。しかし、NOTICE を発行し、宣言された関数の戻り値型を \fBtrigger\fR に変換します。
.PP
現在のリリースでは STATEMENT トリガは実装されていません。
.PP
トリガの削除方法については、DROP TRIGGER [\fBdrop_trigger\fR(l)] コマンドを参照して下さい。
.SH "例"
.PP
指定された distributor のコードが distributors テーブルに存在するかどうか、 films テーブルに行を追加または更新する前に検査します。
.sp
.nf
CREATE TRIGGER if_dist_exists
    BEFORE INSERT OR UPDATE ON films FOR EACH ROW
    EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');
.sp
.fi
.PP
distributor を消去するかまたはそのコードを変更する前に、 films テーブルに対する全ての参照を削除します。
.sp
.nf
CREATE TRIGGER if_film_exists
    BEFORE DELETE OR UPDATE ON distributors FOR EACH ROW
    EXECUTE PROCEDURE check_foreign_key (1, 'CASCADE', 'did', 'films', 'did');
.sp
.fi
.PP
2 番目の例は、以下のように外部キー制約を使用して実現することもできます。
.sp
.nf
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    CONSTRAINT if_film_exists
    FOREIGN KEY(did) REFERENCES films
    ON UPDATE CASCADE ON DELETE CASCADE
);
.sp
.fi
.SH "互換性"
.TP
\fBSQL92\fR
SQL92 には \fBCREATE TRIGGER\fR はありません。
.TP
\fBSQL99\fR
PostgreSQL における \fBCREATE TRIGGER\fR 文は SQL99 標準の一部を実装します。以下の機能は実装されていません。
.RS
.TP 0.2i
\(bu
SQL99 では、特定の列への更新に対してトリガを発行できます。 (例えば、AFTER UPDATE OF col1, col2)
.TP 0.2i
\(bu
SQL99 では、トリガ動作の定義にて使用される ``old''および``new''行やテーブルに別名を定義することができます。 (例えば CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)PostgreSQL では、トリガ関数を複数のユーザ定義の言語で作成することができますので、データへのアクセス方法は言語独自の方法で取り扱われます。
.TP 0.2i
\(bu
PostgreSQL では文レベルのトリガはなく、行レベルのトリガのみ存在します。
.TP 0.2i
\(bu
PostgreSQL では、トリガによる動作としてストアドプロシージャしか実行できません。SQL99 では、複数の SQL コマンド、例えば、\fBCREATE TABLE\fR をトリガによる動作として実行することができます。この制限は、これらのコマンドを実行するストアドプロシージャを作成することで簡単に解決することができます。
.RE
.PP

SQL99 では、トリガが複数ある場合は作成時間順に実行するように指定されています。 それに対し、PostgreSQL では名前順で実行します。名前順の方が作業しやすいと判断したためです。
.SH "関連項目"
CREATE FUNCTION [\fBcreate_function\fR(l)],    ALTER TRIGGER   [\fBalter_trigger\fR(l)], DROP TRIGGER [\fBdrop_trigger\fR(l)], \fIPostgreSQL プログラマガイド\fR
