★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.36. spi

spiモジュールは、サーバプログラミングインタフェース(SPI)およびトリガを使用した、動作可能な例を複数提供します。 これらの関数は独自の何らかの価値を持つものですが、目的に応じて変更するための例としてより有用です。 関数は任意のテーブルと使用できるほど一般的なものですが、トリガを作成する場合は(後述のように)テーブル名とフィールド名を指定する必要があります。

以下で説明する関数グループのそれぞれは、別々にインストールすることができる拡張として提供されます。

F.36.1. refint — 参照整合性を実装する関数

check_primary_key()およびcheck_foreign_key()は、外部キー制約を検査するために使用されます。 (当然ながら、この機能はかなり前に組み込みの外部キー機能に取って代わりました。しかし例としてはまだ有用です。)

check_primary_key()は参照テーブルを検査します。 使用方法は、この関数を使用するBEFORE INSERT OR UPDATEトリガを他のテーブルを参照するテーブルに作成することです。 トリガ引数は、外部キーを形成する参照テーブルの列名、被参照テーブル名、プライマリ/一意キーを形成する被参照テーブルの列名です。 複数の外部キーを扱うためには、各参照に対してトリガを作成してください。

check_foreign_key()は被参照テーブルを検査します。 使用方法は、この関数を使用するBEFORE DELETE OR UPDATEトリガを他のテーブルで参照されるテーブルに作成することです。 トリガ引数は、この関数が検査を実行しなければならない参照テーブル数、参照キーが見つかった場合の動作(cascade — 参照行を削除、restrict — 参照キーが存在する場合トランザクションをアボート、setnull —参照キーフィールドをNULLに設定)、プライマリ/一意キーを形成するトリガを発行したテーブルの列名、参照テーブルの名前と列名(最初の引数で指定された数のテーブル分繰り返す)です。 プライマリ/一意キー列はNOT NULLと指定されていなければならず、また、一意性インデックスを持つべきであることに注意してください。

refint.exampleに例があります。

F.36.2. autoinc — フィールド自動増分用の関数

autoinc()は、整数型フィールドにシーケンスの次の値を格納するトリガです。 これは、組み込みの連番列機能と一部重複しますが、同一ではありません。 autoinc()は挿入時に別のフィールド値に置き換える試みを上書きし、さらに省略可能ですが、更新時にフィールドを増加させるために使用することもできます。

使用方法は、この関数を使用するBEFORE INSERT(または BEFORE INSERT OR UPDATE)トリガを作成することです。 2つのトリガ引数、変更する整数型列の名前と値を生み出すシーケンスオブジェクトの名前を指定します。 (実際、自動増分列を複数更新したい場合、これらの名前の組み合わせを任意の数指定することができます。)

autoinc.exampleに例があります。

F.36.3. insert_username — 誰がテーブルを変更したかを追跡する関数

insert_username()は現在のユーザ名をテキスト型のフィールドに格納するトリガです。 これはテーブル内のある行を最後に変更したユーザを追跡する際に有用です。

使用方法は、この関数を使用するBEFORE INSERTUPDATEまたはその両方のトリガを作成することです。 1つのトリガ引数、変更するテキスト型の列の名前を指定してください。

insert_username.exampleに例があります。

F.36.4. moddatetime — 最終更新時刻を追跡する関数

moddatetime()は現在時刻をtimestamp型のフィールドに格納するトリガです。 これは、テーブル内のある行の最終更新時刻を追跡する際に有用です。

使用方法は、この関数を使用するBEFORE UPDATEトリガを作成することです。 1つのトリガ引数、変更する列名を指定してください。 この列はtimestamp型またはtimestamp with time zone型でなければなりません。

moddatetime.exampleに例があります。