CREATE TRIGGER <refpurpose>define a new trigger</refpurpose> — 新しいトリガを定義する
CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGERname
{ BEFORE | AFTER | INSTEAD OF } {event
[ OR ... ] } ONtable_name
[ FROMreferenced_table_name
] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ] [ REFERENCING { { OLD | NEW } TABLE [ AS ]transition_relation_name
} [ ... ] ] [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN (condition
) ] EXECUTE { FUNCTION | PROCEDURE }function_name
(arguments
) <phrase>where <replaceable class="parameter">event</replaceable> can be one of:</phrase> ここでevent
は以下のいずれかを取ることができます。 INSERT UPDATE [ OFcolumn_name
[, ... ] ] DELETE TRUNCATE
<command>CREATE TRIGGER</command> creates a new trigger.
<command>CREATE OR REPLACE TRIGGER</command> will either create a
new trigger, or replace an existing trigger. The
trigger will be associated with the specified table, view, or foreign table
and will execute the specified
function <replaceable class="parameter">function_name</replaceable> when
certain operations are performed on that table.
CREATE TRIGGER
は新しいトリガを作成します。
CREATE OR REPLACE TRIGGER
は新しいトリガを作成、または、既存のトリガを置き換えます。
作成したトリガは指定したテーブル、ビューまたは外部テーブルと関連付けられ、そのテーブルに特定の操作が行われた時に指定した関数function_name
を実行します。
To replace the current definition of an existing trigger, use
<command>CREATE OR REPLACE TRIGGER</command>, specifying the existing
trigger's name and parent table. All other properties are replaced.
既存トリガの現在の定義を置き換えるには、既存のトリガ名と親テーブルを指定してCREATE OR REPLACE TRIGGER
を使用してください。
その他の属性はすべて置き換えられます。
The trigger can be specified to fire before the
operation is attempted on a row (before constraints are checked and
the <command>INSERT</command>, <command>UPDATE</command>, or
<command>DELETE</command> is attempted); or after the operation has
completed (after constraints are checked and the
<command>INSERT</command>, <command>UPDATE</command>, or
<command>DELETE</command> has completed); or instead of the operation
(in the case of inserts, updates or deletes on a view).
If the trigger fires before or instead of the event, the trigger can skip
the operation for the current row, or change the row being inserted (for
<command>INSERT</command> and <command>UPDATE</command> operations
only). If the trigger fires after the event, all changes, including
the effects of other triggers, are <quote>visible</quote>
to the trigger.
トリガでは、起動のタイミングとして、行への操作が開始される前(制約条件のチェックとINSERT
、UPDATE
またはDELETE
が行われる前)、操作が完了した後(制約条件がチェックされ、INSERT
、UPDATE
またはDELETE
が完了した後)、操作の代わり(ビューにおける挿入、更新、削除の場合)のいずれかを指定することができます。
イベントの前または代わりにトリガが起動する場合、そのトリガは対象行に対する操作を省略したり、(INSERT
とUPDATE
の操作時のみ)挿入する行を変更したりすることができます。
イベントの後にトリガが起動する場合、他のトリガの影響を含む全ての変更が、トリガに対して「可視」状態となります。
A trigger that is marked <literal>FOR EACH ROW</literal> is called
once for every row that the operation modifies. For example, a
<command>DELETE</command> that affects 10 rows will cause any
<literal>ON DELETE</literal> triggers on the target relation to be
called 10 separate times, once for each deleted row. In contrast, a
trigger that is marked <literal>FOR EACH STATEMENT</literal> only
executes once for any given operation, regardless of how many rows
it modifies (in particular, an operation that modifies zero rows
will still result in the execution of any applicable <literal>FOR
EACH STATEMENT</literal> triggers).
FOR EACH ROW
付きのトリガは、その操作によって変更される行ごとに1回ずつ呼び出されます。
例えば、10行に影響を与えるDELETE
操作は、対象リレーション上のすべてのON DELETE
トリガを、削除される各行について1回ずつ、個別に10回呼び出すことになります。
反対に、FOR EACH STATEMENT
付きのトリガは、その操作によって何行変更されたかにかかわらず、任意の操作ごとに1回のみ実行されます
(変更対象が0行となる操作でも、適用できるすべてのFOR EACH STATEMENT
トリガが実行されます)。
Triggers that are specified to fire <literal>INSTEAD OF</literal> the trigger
event must be marked <literal>FOR EACH ROW</literal>, and can only be defined
on views. <literal>BEFORE</literal> and <literal>AFTER</literal> triggers on a view
must be marked as <literal>FOR EACH STATEMENT</literal>.
トリガイベントのINSTEAD OF
として発行されるように指定されたトリガはFOR EACH ROW
印を付けなければなりません。
またビュー上にのみ定義することができます。
ビューに対するBEFORE
およびAFTER
トリガはFOR EACH STATEMENT
印を付けなければなりません。
In addition, triggers may be defined to fire for
<command>TRUNCATE</command>, though only
<literal>FOR EACH STATEMENT</literal>.
さらに、FOR EACH STATEMENT
のみですが、トリガをTRUNCATE
に対して発行するように定義することができます。
The following table summarizes which types of triggers may be used on tables, views, and foreign tables: 以下の表にどの種類のトリガがテーブル、ビュー、外部テーブルに対して使用できるかをまとめます。
いつ | イベント | 行レベル | 文レベル |
---|---|---|---|
BEFORE | INSERT /UPDATE /DELETE | テーブルおよび外部テーブル | テーブル、ビューおよび外部テーブル |
TRUNCATE | — | テーブルおよび外部テーブル | |
AFTER | INSERT /UPDATE /DELETE | テーブルおよび外部テーブル | テーブル、ビューおよび外部テーブル |
TRUNCATE | — | テーブルおよび外部テーブル | |
INSTEAD OF | INSERT /UPDATE /DELETE | ビュー | — |
TRUNCATE | — | — |
Also, a trigger definition can specify a Boolean <literal>WHEN</literal>
condition, which will be tested to see whether the trigger should
be fired. In row-level triggers the <literal>WHEN</literal> condition can
examine the old and/or new values of columns of the row. Statement-level
triggers can also have <literal>WHEN</literal> conditions, although the feature
is not so useful for them since the condition cannot refer to any values
in the table.
またトリガ定義では、論理値のWHEN
条件を指定することができ、これによってトリガを発行すべきかどうかが判定されます。
行レベルのトリガでは、WHEN
条件は行の列の古い値、新しい値、またはその両方で検証することができます。
文レベルのトリガでもWHEN
条件を持たせることができますが、条件としてテーブル内のどの値も参照することができませんので、この機能はあまり有用ではありません。
If multiple triggers of the same kind are defined for the same event, they will be fired in alphabetical order by name. 同一イベントに同じ種類の複数のトリガが定義された場合、名前のアルファベット順で実行されます。
When the <literal>CONSTRAINT</literal> option is specified, this command creates a
<firstterm>constraint trigger</firstterm>.<indexterm><primary>trigger</primary>
<secondary>constraint trigger</secondary></indexterm>
This is the same as a regular trigger
except that the timing of the trigger firing can be adjusted using
<link linkend="sql-set-constraints"><command>SET CONSTRAINTS</command></link>.
Constraint triggers must be <literal>AFTER ROW</literal> triggers on plain
tables (not foreign tables). They
can be fired either at the end of the statement causing the triggering
event, or at the end of the containing transaction; in the latter case they
are said to be <firstterm>deferred</firstterm>. A pending deferred-trigger firing
can also be forced to happen immediately by using <command>SET
CONSTRAINTS</command>. Constraint triggers are expected to raise an exception
when the constraints they implement are violated.
CONSTRAINT
オプションが指定された場合、このコマンドは制約トリガを作成します。
これは、SET CONSTRAINTS
を使用してトリガを発行するタイミングを調整することができるという点を除き、通常のトリガと同じです。
制約トリガは(外部テーブルではない)普通のテーブルのAFTER ROW
トリガでなければなりません。
トリガイベントを引き起こした文の最後、またはそれを含むトランザクションの最後のいずれかで発行することができます。
後者の場合、遅延と呼ばれます。
SET CONSTRAINTS
を使用することで、強制的に待機中の遅延トリガの発行を即座に行わせることができます。
制約トリガは、実装する制約に違反した時に例外を発生するものと想定されています。
The <literal>REFERENCING</literal> option enables collection
of <firstterm>transition relations</firstterm>, which are row sets that include all
of the rows inserted, deleted, or modified by the current SQL statement.
This feature lets the trigger see a global view of what the statement did,
not just one row at a time. This option is only allowed for
an <literal>AFTER</literal> trigger that is not a constraint trigger; also, if
the trigger is an <literal>UPDATE</literal> trigger, it must not specify
a <replaceable class="parameter">column_name</replaceable> list.
<literal>OLD TABLE</literal> may only be specified once, and only for a trigger
that can fire on <literal>UPDATE</literal> or <literal>DELETE</literal>; it creates a
transition relation containing the <firstterm>before-images</firstterm> of all rows
updated or deleted by the statement.
Similarly, <literal>NEW TABLE</literal> may only be specified once, and only for
a trigger that can fire on <literal>UPDATE</literal> or <literal>INSERT</literal>;
it creates a transition relation containing the <firstterm>after-images</firstterm>
of all rows updated or inserted by the statement.
REFERENCING
オプションは遷移リレーションの収集を有効にします。
遷移リレーションとは現在のSQL文によって挿入、削除または修正されたすべての行を含む行集合です。
この機能により、トリガはSQL文によって行われたことを、一度に1行ずつだけではなく、全体のビューとして参照することができます。
このオプションは、制約トリガではないAFTER
トリガについてのみ使うことができます。
また、トリガがUPDATE
トリガの場合、column_name
のリストを指定してはいけません。
OLD TABLE
は一度だけ指定することができ、UPDATE
またはDELETE
のときに実行されるトリガにのみ指定できます。
これは文によって更新または削除されるすべての行の更新前イメージを含む遷移リレーションを作成します。
同様に、NEW TABLE
は一度だけ指定することができ、UPDATE
またはINSERT
のときに実行されるトリガにのみ指定できます。
これは、文によって更新または挿入されるすべての行の更新後イメージを含む遷移リレーションを作成します。
<command>SELECT</command> does not modify any rows so you cannot
create <command>SELECT</command> triggers. Rules and views may provide
workable solutions to problems that seem to need <command>SELECT</command>
triggers.
SELECT
はまったく行を変更しないため、SELECT
トリガを作成することはできません。
SELECT
トリガが必要に見える問題には、ルールやビューが現実的な解決策を提供できるでしょう。
Refer to <xref linkend="triggers"/> for more information about triggers. トリガに関するより詳細については、第37章を参照してください。
name
The name to give the new trigger. This must be distinct from
the name of any other trigger for the same table.
The name cannot be schema-qualified — the trigger inherits the
schema of its table. For a constraint trigger, this is also the name to
use when modifying the trigger's behavior using
<command>SET CONSTRAINTS</command>.
新しいトリガに付与する名前です。
同じテーブルの他のトリガと異なる名前にする必要があります。
名前をスキーマ修飾することはできません。
トリガはそのテーブルのスキーマを引き継ぎます。
制約トリガの場合、この名前がSET CONSTRAINTS
を使用してトリガの動作を変更する時に使用されます。
BEFORE
AFTER
INSTEAD OF
Determines whether the function is called before, after, or instead of
the event. A constraint trigger can only be specified as
<literal>AFTER</literal>.
関数の呼び出しをイベントの前に行うか後に行うか、それとも代替として行うかを決定します。
制約トリガではAFTER
としてしか指定することができません。
event
One of <literal>INSERT</literal>, <literal>UPDATE</literal>,
<literal>DELETE</literal>, or <literal>TRUNCATE</literal>;
this specifies the event that will fire the trigger. Multiple
events can be specified using <literal>OR</literal>, except when
transition relations are requested.
INSERT
、UPDATE
、DELETE
、TRUNCATE
のいずれかが入ります。
このパラメータは、トリガを起動するイベントを指定します。
遷移リレーションが要求される場合を除き、OR
を使用して、複数のイベントを指定することができます。
For <literal>UPDATE</literal> events, it is possible to
specify a list of columns using this syntax:
UPDATE
イベントでは、以下の構文を使用して列リストを指定することができます。
UPDATE OFcolumn_name1
[,column_name2
... ]
The trigger will only fire if at least one of the listed columns
is mentioned as a target of the <command>UPDATE</command> command
or if one of the listed columns is a generated column that depends on a
column that is the target of the <command>UPDATE</command>.
このトリガは、UPDATE
コマンドの対象として列挙された列のいずれか少なくとも1つの列が指定された場合に、もしくは列挙された列の1つがUPDATE
の対象の列に依存する生成列である場合に、発行されます。
<literal>INSTEAD OF UPDATE</literal> events do not allow a list of columns.
A column list cannot be specified when requesting transition relations,
either.
INSTEAD OF UPDATE
イベントでは列リストを使用できません。
遷移リレーションを要求する場合も列リストを指定することはできません。
table_name
The name (optionally schema-qualified) of the table, view, or foreign table the trigger is for. トリガを作成するテーブル、ビューまたは外部テーブルの名前です(スキーマ修飾名も可)。
referenced_table_name
The (possibly schema-qualified) name of another table referenced by the constraint. This option is used for foreign-key constraints and is not recommended for general use. This can only be specified for constraint triggers. 制約で参照される他のテーブルの名前(スキーマ修飾可)です。 このオプションは外部キー制約で使用されるものであり、一般利用を推奨しません。 これは制約トリガでのみ指定することができます。
DEFERRABLE
NOT DEFERRABLE
INITIALLY IMMEDIATE
INITIALLY DEFERRED
The default timing of the trigger. See the <xref linkend="sql-createtable"/> documentation for details of these constraint options. This can only be specified for constraint triggers. トリガのデフォルトのタイミングです。 これらの制約オプションについてはCREATE TABLE文書を参照してください。 これは制約トリガでのみ指定することができます。
REFERENCING
This keyword immediately precedes the declaration of one or two relation names that provide access to the transition relations of the triggering statement. このキーワードは、トリガの文の遷移リレーションへのアクセスを提供する1つまたは2つのリレーション名の宣言の直前に起きます。
OLD TABLE
NEW TABLE
This clause indicates whether the following relation name is for the before-image transition relation or the after-image transition relation. この句は、それに続くリレーション名が更新前イメージの遷移リレーションなのか、更新後イメージの遷移リレーションなのかを示します。
transition_relation_name
The (unqualified) name to be used within the trigger for this transition relation. この遷移リレーションについて、トリガ内で使用される(修飾されていない)名前です。
FOR EACH ROW
FOR EACH STATEMENT
This specifies whether the trigger function should be fired
once for every row affected by the trigger event, or just once
per SQL statement. If neither is specified, <literal>FOR EACH
STATEMENT</literal> is the default. Constraint triggers can only
be specified <literal>FOR EACH ROW</literal>.
このパラメータは、トリガ関数を、トリガイベントによって影響を受ける行ごとに1回起動するか、SQL文ごとに1回のみ起動するかを指定します。
どちらも指定されない場合は、FOR EACH STATEMENT
がデフォルトです。
制約トリガはFOR EACH ROW
のみ指定することができます。
condition
A Boolean expression that determines whether the trigger function
will actually be executed. If <literal>WHEN</literal> is specified, the
function will only be called if the <replaceable
class="parameter">condition</replaceable> returns <literal>true</literal>.
In <literal>FOR EACH ROW</literal> triggers, the <literal>WHEN</literal>
condition can refer to columns of the old and/or new row values
by writing <literal>OLD.<replaceable
class="parameter">column_name</replaceable></literal> or
<literal>NEW.<replaceable
class="parameter">column_name</replaceable></literal> respectively.
Of course, <literal>INSERT</literal> triggers cannot refer to <literal>OLD</literal>
and <literal>DELETE</literal> triggers cannot refer to <literal>NEW</literal>.
トリガ関数を実際に実行するか否かを決定する論理式です。
WHEN
が指定された場合、condition
がtrue
を返す場合のみ関数が呼び出されます。
FOR EACH ROW
トリガでは、WHEN
条件で、それぞれOLD.
、column_name
NEW.
と記述することで、古い行の値、新しい行の値、またはその両方の列を参照することができます。
当然ながらcolumn_name
INSERT
トリガではOLD
を参照することはできませんし、DELETE
トリガではNEW
を参照することはできません。
INSTEAD OF
トリガはWHEN
条件をサポートしません。
Currently, <literal>WHEN</literal> expressions cannot contain
subqueries.
現時点ではWHEN
条件に副問い合わせを含めることはできません。
Note that for constraint triggers, evaluation of the <literal>WHEN</literal>
condition is not deferred, but occurs immediately after the row update
operation is performed. If the condition does not evaluate to true then
the trigger is not queued for deferred execution.
制約トリガでは、WHEN
条件の評価は遅延されず、行の更新操作が行われた直後に発生することに注意してください。
この条件が真と評価されなかった場合、トリガは遅延実行用のキューに入りません。
function_name
A user-supplied function that is declared as taking no arguments
and returning type <literal>trigger</literal>, which is executed when
the trigger fires.
ユーザが提供する関数です。この関数は、引数を取らずtrigger
型を返すよう定義されます。トリガが起動した時に実行されます。
In the syntax of <literal>CREATE TRIGGER</literal>, the keywords
<literal>FUNCTION</literal> and <literal>PROCEDURE</literal> are
equivalent, but the referenced function must in any case be a function,
not a procedure. The use of the keyword <literal>PROCEDURE</literal>
here is historical and deprecated.
CREATE TRIGGER
の構文では、キーワードFUNCTION
とPROCEDURE
は等価ですが、参照されている関数はどちらの場合でも関数でなければならず、プロシージャであってはなりません。
ここでキーワードPROCEDURE
を使うことは、歴史的なものであり廃止予定です。
arguments
An optional comma-separated list of arguments to be provided to the function when the trigger is executed. The arguments are literal string constants. Simple names and numeric constants can be written here, too, but they will all be converted to strings. Please check the description of the implementation language of the trigger function to find out how these arguments can be accessed within the function; it might be different from normal function arguments. トリガ実行時に関数に渡される引数をカンマで区切ったリストで、省略可能です。 引数として指定するのは、リテラル文字列定数です。 単純な名前および数値定数を記述できますが、全て文字列に変換されます。 関数内でこれらの引数にアクセスする方法について調べるためには、トリガ関数を実装した言語の説明を参照してください。 通常の関数引数とは異なる場合があります。
To create or replace a trigger on a table, the user must have the
<literal>TRIGGER</literal> privilege on the table. The user must
also have <literal>EXECUTE</literal> privilege on the trigger function.
テーブルに対してトリガを作成もしくは変更するには、ユーザがそのテーブルに対しTRIGGER
権限を持っている必要があります。
またユーザはトリガ関数に対しEXECUTE
権限を持たなければなりません。
Use <link linkend="sql-droptrigger"><command>DROP TRIGGER</command></link> to remove a trigger.
トリガを削除するためにはDROP TRIGGER
を使用してください。
Creating a row-level trigger on a partitioned table will cause an
identical <quote>clone</quote> trigger to be created on each of its
existing partitions; and any partitions created or attached later will have
an identical trigger, too. If there is a conflictingly-named trigger on a
child partition already, an error occurs unless <command>CREATE OR REPLACE
TRIGGER</command> is used, in which case that trigger is replaced with a
clone trigger. When a partition is detached from its parent, its clone
triggers are removed.
パーティションテーブルに行レベルのトリガを作ると、存在するパーティションすべてに同一の「クローン」トリガがつくられます。そして、後から作られたり追加されるパーティションも同一のトリガを含みます。
子パーティションに名前が衝突するトリガがすでにある場合には、CREATE OR REPLACE
TRIGGER
によってそのトリガをクローントリガで置き換えない限りエラーになります。
パーティションが親から切り離された場合、クローントリガは削除されます。
A column-specific trigger (one defined using the <literal>UPDATE OF
<replaceable>column_name</replaceable></literal> syntax) will fire when any
of its columns are listed as targets in the <command>UPDATE</command>
command's <literal>SET</literal> list. It is possible for a column's value
to change even when the trigger is not fired, because changes made to the
row's contents by <literal>BEFORE UPDATE</literal> triggers are not considered.
Conversely, a command such as <literal>UPDATE ... SET x = x ...</literal>
will fire a trigger on column <literal>x</literal>, even though the column's
value did not change.
列指定のトリガ(UPDATE OF
構文で定義されたトリガ)は、列挙された列のいずれかがcolumn_name
UPDATE
コマンドのSET
リスト内に対象として指定された場合に発行されます。
BEFORE UPDATE
トリガにより行の内容になされた変更は考慮されないため、トリガが発行されない場合であっても、列の値が変更されることはあります。
反対に、UPDATE ... SET x = x ...
のようなコマンドは、列の値が変更されませんが、x
列に対するトリガが発行されます。
In a <literal>BEFORE</literal> trigger, the <literal>WHEN</literal> condition is
evaluated just before the function is or would be executed, so using
<literal>WHEN</literal> is not materially different from testing the same
condition at the beginning of the trigger function. Note in particular
that the <literal>NEW</literal> row seen by the condition is the current value,
as possibly modified by earlier triggers. Also, a <literal>BEFORE</literal>
trigger's <literal>WHEN</literal> condition is not allowed to examine the
system columns of the <literal>NEW</literal> row (such as <literal>ctid</literal>),
because those won't have been set yet.
BEFORE
トリガにおいてWHEN
条件は関数が実行される、またはされそうな直前に評価されます。
このためWHEN
の使用はトリガ関数の先頭で同一の条件を試験することと実質的に違いはありません。
この条件で確認できるNEW
行が現在の値であり、それまでのトリガで変更されている可能性があることに、特に注意して下さい。
またBEFORE
トリガのWHEN
条件では、NEW
行のシステム列(ctid
など)はまだ設定されていないので、検査することができません。
In an <literal>AFTER</literal> trigger, the <literal>WHEN</literal> condition is
evaluated just after the row update occurs, and it determines whether an
event is queued to fire the trigger at the end of statement. So when an
<literal>AFTER</literal> trigger's <literal>WHEN</literal> condition does not return
true, it is not necessary to queue an event nor to re-fetch the row at end
of statement. This can result in significant speedups in statements that
modify many rows, if the trigger only needs to be fired for a few of the
rows.
AFTER
トリガにおいて、WHEN
条件は行の更新を行った直後に評価され、文の最後でトリガを発行するためにイベントを保持すべきかどうかを決定します。
このためAFTER
トリガのWHEN
条件は真を返さない場合、イベントを保持する必要もありませんし、文の最後の行を再度取り出す必要もありません。
これにより、トリガをわずかな行のみに対して発行する必要がある場合、多くの行を変更する文を非常に高速にすることができます。
In some cases it is possible for a single SQL command to fire more than
one kind of trigger. For instance an <command>INSERT</command> with
an <literal>ON CONFLICT DO UPDATE</literal> clause may cause both insert and
update operations, so it will fire both kinds of triggers as needed.
The transition relations supplied to triggers are
specific to their event type; thus an <command>INSERT</command> trigger
will see only the inserted rows, while an <command>UPDATE</command>
trigger will see only the updated rows.
場合によっては1つのSQLコマンドが2種類以上のトリガを発行することがあります。
例えば、ON CONFLICT DO UPDATE
句のあるINSERT
では、挿入と更新の両方の操作が発生するかもしれないので、必要に応じて両方の種類のトリガを発行します。
トリガに提供される遷移リレーションはトリガのイベント種類毎に個別のものです。
従って、INSERT
トリガには挿入された行だけが見え、一方でUPDATE
トリガには更新された行だけが見えます。
Row updates or deletions caused by foreign-key enforcement actions, such
as <literal>ON UPDATE CASCADE</literal> or <literal>ON DELETE SET NULL</literal>, are
treated as part of the SQL command that caused them (note that such
actions are never deferred). Relevant triggers on the affected table will
be fired, so that this provides another way in which an SQL command might
fire triggers not directly matching its type. In simple cases, triggers
that request transition relations will see all changes caused in their
table by a single original SQL command as a single transition relation.
However, there are cases in which the presence of an <literal>AFTER ROW</literal>
trigger that requests transition relations will cause the foreign-key
enforcement actions triggered by a single SQL command to be split into
multiple steps, each with its own transition relation(s). In such cases,
any statement-level triggers that are present will be fired once per
creation of a transition relation set, ensuring that the triggers see
each affected row in a transition relation once and only once.
ON UPDATE CASCADE
やON DELETE SET NULL
など外部キーを強制する動作によって起こる行の更新や削除は、それを起こしたSQLコマンドの一部であるとみなされます(このような動作は決して遅延実行されないことに注意してください)。
影響を受けたテーブルの関連するトリガが発行されるため、これはSQLコマンドの種類と直接には一致しないトリガが発行される別のケースとなります。
単純な場合、遷移リレーションを要求するトリガは、元となる1つのSQLコマンドによって起こされたテーブルへのすべての変更を、一つの遷移リレーションとして見ることになります。
しかし、遷移リレーションを要求するAFTER ROW
トリガの存在により、一つのSQLコマンドによって発生する外部キーを強制する動作が複数のステップに分割され、各ステップがそれぞれの遷移リレーションを持つという場合もあります。
そのような場合、すべての文レベルのトリガは1つの遷移リレーションの集合の作成に対して1度ずつ呼び出され、それによりトリガが遷移リレーション内の変更された行をちょうど一度だけ見ることを確実にしています。
Statement-level triggers on a view are fired only if the action on the
view is handled by a row-level <literal>INSTEAD OF</literal> trigger.
If the action is handled by an <literal>INSTEAD</literal> rule, then
whatever statements are emitted by the rule are executed in place of the
original statement naming the view, so that the triggers that will be
fired are those on tables named in the replacement statements.
Similarly, if the view is automatically updatable, then the action is
handled by automatically rewriting the statement into an action on the
view's base table, so that the base table's statement-level triggers are
the ones that are fired.
ビューに付けられている文レベルのトリガは、ビューに対する操作が行レベルのINSTEAD OF
トリガによって取り扱われた時にのみ発行されます。
ビューに対する操作がINSTEAD OF
ルールによって取り扱われる場合は、ビューを指定した元の文の代わりに、そのルールが出力した文が実行されます。
それにより、発行されるトリガは、置き換えられた文によって指定されたテーブルに付けられたトリガとなります。
同様に、ビューが自動更新可能ならば、操作は、ビューの基底テーブル上の操作に自動的に書き換えられる文によって取り扱われます。
その結果、発行されるのは基底テーブルの文レベルのトリガとなります。
Modifying a partitioned table or a table with inheritance children fires
statement-level triggers attached to the explicitly named table, but not
statement-level triggers for its partitions or child tables. In contrast,
row-level triggers are fired on the rows in affected partitions or
child tables, even if they are not explicitly named in the query.
If a statement-level trigger has been defined with transition relations
named by a <literal>REFERENCING</literal> clause, then before and after
images of rows are visible from all affected partitions or child tables.
In the case of inheritance children, the row images include only columns
that are present in the table that the trigger is attached to.
パーティションテーブルや継承した子テーブルがあるテーブルを変更したとき、明示的に指定されたテーブルに付けられている文レベルのトリガが発行されますが、パーティションや子テーブルに付けられている文レベルのトリガは発行されません。
対照的に、問合せ中で明示的に指定されていなくても、行レベルのトリガはすべての変更されたパーティションや子テーブルに対して発行されます。
REFERENCING
句で指定された遷移リレーションのある文レベルのトリガが定義されている場合、行の変更前イメージおよび変更後イメージは、変更されたすべてのパーティションおよび子テーブルから見ることができます。
継承された子テーブルの場合、行イメージはトリガが付けられたテーブルに存在する列だけしか含みません。
Currently, row-level triggers with transition relations cannot be defined
on partitions or inheritance child tables. Also, triggers on partitioned
tables may not be <literal>INSTEAD OF</literal>.
現在のところ、遷移リレーションのある行レベルトリガは、パーティションや継承した子テーブルには定義できません。
また、パーティションテーブルのトリガはINSTEAD OF
とすることはできません。
Currently, the <literal>OR REPLACE</literal> option is not supported for
constraint triggers.
現在のところ、OR REPLACE
オプションは制約トリガに対してはサポートされていません。
Replacing an existing trigger within a transaction that has already performed updating actions on the trigger's table is not recommended. Trigger firing decisions, or portions of firing decisions, that have already been made will not be reconsidered, so the effects could be surprising. トリガのテーブルに対してすでに更新動作を実行したトランザクション内で、既存のトリガを置き換えることはお勧めしません。 既に決定されたトリガ発行、もしくは発行の判断のうち既に決定された部分は再考されることはありませんので、結果は驚くべきものになるかもしれません。
There are a few built-in trigger functions that can be used to solve common problems without having to write your own trigger code; see <xref linkend="functions-trigger"/>. 自身でトリガのコードを書かなくても、よくある問題を解決するために使うことのできる組み込みのトリガ関数が多少あります。9.29を参照してください。
Execute the function <function>check_account_update</function> whenever
a row of the table <literal>accounts</literal> is about to be updated:
テーブルaccounts
の行が更新される直前に関数check_account_update
を実行します。
CREATE TRIGGER check_update BEFORE UPDATE ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_update();
Modify that trigger definition to only execute the function if
column <literal>balance</literal> is specified as a target in
the <command>UPDATE</command> command:
UPDATE
コマンドでbalance
列が対象として指定されている場合にのみ関数を実行するよう、そのトリガ定義を修正します。
CREATE OR REPLACE TRIGGER check_update BEFORE UPDATE OF balance ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_update();
This form only executes the function if column <literal>balance</literal>
has in fact changed value:
以下の構文では、列balance
が実際に変更された場合のみ関数が実行されます。
CREATE TRIGGER check_update BEFORE UPDATE ON accounts FOR EACH ROW WHEN (OLD.balance IS DISTINCT FROM NEW.balance) EXECUTE FUNCTION check_account_update();
Call a function to log updates of <literal>accounts</literal>, but only if
something changed:
何か変更された場合のみにaccounts
の更新のログを取る関数を呼び出します。
CREATE TRIGGER log_update AFTER UPDATE ON accounts FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE FUNCTION log_account_update();
Execute the function <function>view_insert_row</function> for each row to insert
rows into the tables underlying a view:
ビューの背後にあるテーブルに行を挿入するために、各行に対して関数view_insert_row
を実行します。
CREATE TRIGGER view_insert INSTEAD OF INSERT ON my_view FOR EACH ROW EXECUTE FUNCTION view_insert_row();
Execute the function <function>check_transfer_balances_to_zero</function> for each
statement to confirm that the <literal>transfer</literal> rows offset to a net of
zero:
各文に対して関数check_transfer_balances_to_zero
を実行して、transfer
の行が相殺してゼロになることを確認します。
CREATE TRIGGER transfer_insert AFTER INSERT ON transfer REFERENCING NEW TABLE AS inserted FOR EACH STATEMENT EXECUTE FUNCTION check_transfer_balances_to_zero();
Execute the function <function>check_matching_pairs</function> for each row to
confirm that changes are made to matching pairs at the same time (by the
same statement):
各行に対して関数check_matching_pairs
を実行して、対応する組み合わせに対して同じ時に(同じ文により)変更されていることを確認します。
CREATE TRIGGER paired_items_update AFTER UPDATE ON paired_items REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab FOR EACH ROW EXECUTE FUNCTION check_matching_pairs();
<xref linkend="trigger-example"/> contains a complete example of a trigger function written in C. 37.4には、C言語で作成されたトリガ関数の完全な例があります。
The <command>CREATE TRIGGER</command> statement in
<productname>PostgreSQL</productname> implements a subset of the
<acronym>SQL</acronym> standard. The following functionalities are currently
missing:
PostgreSQLにおけるCREATE TRIGGER
文は標準SQLのサブセットを実装したものです。
現在は、PostgreSQLには、次の機能がありません。
While transition table names for <literal>AFTER</literal> triggers are
specified using the <literal>REFERENCING</literal> clause in the standard way,
the row variables used in <literal>FOR EACH ROW</literal> triggers may not be
specified in a <literal>REFERENCING</literal> clause. They are available in a
manner that is dependent on the language in which the trigger function
is written, but is fixed for any one language. Some languages
effectively behave as though there is a <literal>REFERENCING</literal> clause
containing <literal>OLD ROW AS OLD NEW ROW AS NEW</literal>.
AFTER
トリガの遷移テーブル名はREFERENCING
句を使って標準SQLの方法で指定できますが、FOR EACH ROW
トリガで使用される行変数はREFERENCING
句で指定することができません。
それはトリガ関数が書かれる言語に依存する方法で利用できますが、各言語によって決まった方法になります。
一部の言語は、REFERENCING
句がOLD ROW AS OLD NEW ROW AS NEW
となっているかのように動作します。
The standard allows transition tables to be used with
column-specific <literal>UPDATE</literal> triggers, but then the set of rows
that should be visible in the transition tables depends on the
trigger's column list. This is not currently implemented by
<productname>PostgreSQL</productname>.
標準SQLでは列を指定したUPDATE
トリガでも遷移テーブルを使うことができますが、その場合遷移テーブルで見ることができる行の集合はトリガの列リストに依存します。
これは現在のところPostgreSQLでは実装されていません。
<productname>PostgreSQL</productname> only allows the execution
of a user-defined function for the triggered action. The standard
allows the execution of a number of other SQL commands, such as
<command>CREATE TABLE</command>, as the triggered action. This
limitation is not hard to work around by creating a user-defined
function that executes the desired commands.
PostgreSQLでは、トリガ動作として、ユーザ定義関数の実行しか認めていません。
標準では、多数の他のSQLコマンドを実行させることができます。
例えば、トリガ動作としてCREATE TABLE
を実行させることも可能です。
この制限を回避する方法は簡単です。必要なコマンドを実行するユーザ定義関数を作成すればよいのです。
SQL specifies that multiple triggers should be fired in time-of-creation order. <productname>PostgreSQL</productname> uses name order, which was judged to be more convenient. SQLでは、複数のトリガは、作成時刻順に起動すべきであると規定しています。 PostgreSQLでは名前順です。この方が便利だと考えられるからです。
SQL specifies that <literal>BEFORE DELETE</literal> triggers on cascaded
deletes fire <emphasis>after</emphasis> the cascaded <literal>DELETE</literal> completes.
The <productname>PostgreSQL</productname> behavior is for <literal>BEFORE
DELETE</literal> to always fire before the delete action, even a cascading
one. This is considered more consistent. There is also nonstandard
behavior if <literal>BEFORE</literal> triggers modify rows or prevent
updates during an update that is caused by a referential action. This can
lead to constraint violations or stored data that does not honor the
referential constraint.
SQLでは、数珠繋ぎの削除に対するBEFORE DELETE
は、数珠繋ぎのDELETE
が完了した後に発行するものと規定しています。
PostgreSQLでは、BEFORE DELETE
は常に削除操作よりも前に、それも起点となる削除よりも前に行われます。
この方がより一貫性があると考えられいます。
また、参照整合性に関する動作により引き起こされる更新を実行している間に、BEFORE
トリガが行を更新し、更新を妨げるような場合の動作も標準に従わないものがあります。
これは、制約違反となるかもしれませんし、参照整合性制約に合わないデータを格納してしまうかもしれません。
The ability to specify multiple actions for a single trigger using
<literal>OR</literal> is a <productname>PostgreSQL</productname> extension of
the SQL standard.
OR
を使用して単一トリガに複数の動作を指定する機能は、標準SQLに対するPostgreSQLの拡張です。
The ability to fire triggers for <command>TRUNCATE</command> is a
<productname>PostgreSQL</productname> extension of the SQL standard, as is the
ability to define statement-level triggers on views.
TRUNCATE
でのトリガ発行機能、および、ビューに対する文レベルのトリガの定義機能は標準SQLに対するPostgreSQLの拡張です。
<command>CREATE CONSTRAINT TRIGGER</command> is a
<productname>PostgreSQL</productname> extension of the <acronym>SQL</acronym>
standard.
So is the <literal>OR REPLACE</literal> option.
CREATE CONSTRAINT TRIGGER
は標準SQLに対するPostgreSQLの拡張です。
OR REPLACE
オプションも同じです。