PostgreSQL トリガー: 作成、リスト、ドロップの例

⚡ スマートサマリー

PostgreSQL トリガーとは、テーブルに対してINSERT、UPDATE、またはDELETEイベントが発生したときに自動的に実行される関数であり、追加のアプリケーションコードなしでデータベースがルールを適用し、変更をログに記録し、データを監査することを可能にします。

  • 定義: トリガーとは、INSERT、UPDATE、DELETEなどのデータベースイベントが発生した際に自動的に呼び出される関数です。
  • 🔁 範囲: FOR EACH ROWは影響を受ける行ごとにトリガーを1回実行しますが、FOR EACH STATEMENTは操作ごとにトリガーを1回実行します。
  • 🛠️ 作成: CREATE TRIGGER は、関数をテーブルにバインドし、BEFORE、AFTER、または INSTEAD OF のタイミングを設定します。
  • ???? リスト: pg_triggerカタログに対してSELECT tgnameクエリを実行すると、データベース内のすべてのトリガーが表示されます。
  • 🗑️ 落とす: DROP TRIGGER はトリガーを削除し、IF EXISTS はトリガーが存在しない場合に発生するエラーを防ぎます。
  • 🤖 AIヘルプ: AIアシスタントは、平易な言葉によるリクエストに基づいてトリガー機能を生成し、実行前または実行後のタイミングを提案します。

PostgreSQL トリガ

トリガーとは何ですか PostgreSQL?

A PostgreSQL トリガー トリガーは、データベースオブジェクト(例えばテーブル)でデータベースイベントが発生したときに自動的に起動する機能です。トリガーを起動できるデータベースイベントの例としては、INSERT、UPDATE、DELETEなどがあります。また、テーブルに対してトリガーを作成すると、そのテーブルが削除されたときにトリガーも自動的に削除されます。

トリガーの使用方法 PostgreSQL?

トリガーは、作成時に FOR EACH ROW 演算子で指定できます。このトリガーは、操作によって変更される行ごとに一度呼び出されます。また、トリガーは、作成時に FOR EACH STATEMENT 演算子で指定することもできます。このトリガーは、特定の操作に対して一度だけ実行されます。

PostgreSQL トリガーを作成します。

トリガーを作成するには、CREATE TRIGGER 関数を使用します。 関数の構文は次のとおりです。

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

トリガー名はトリガーの名前です。

BEFORE、AFTER、INSTEAD OF は、トリガーをいつ呼び出すかを決定するキーワードです。

イベント名は、トリガーを呼び出すイベントの名前です。 これは可能です INSERT、更新、削除など。

table-name は、トリガーが作成されるテーブルの名前です。

INSERT 操作用にトリガーを作成する場合は、ON 列名パラメータを追加する必要があります。

次の構文はこれを示しています。

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL トリガーの作成例

以下の価格表を使用します。

価格:

PostgreSQL トリガーを作成します。

別のテーブル、Price_Audits を作成して、Price テーブルに加えられた変更を記録します。

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

これで、auditfunc という名前の新しい関数を定義できます。

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

上記の関数は、新しい行 ID とレコードの作成時刻を含むレコードをテーブル Price_Audits に挿入します。

トリガー関数ができたので、それをPriceテーブルにバインドしましょう。トリガーの名前はprice_triggerとします。新しいレコードが作成される前に、トリガー関数が自動的に呼び出され、変更がログに記録されます。トリガーは以下のとおりです。

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

新しいレコードを Price テーブルに挿入してみましょう。

INSERT INTO Price
VALUES (3, 400);

Priceテーブルにレコードを挿入したので、作成したトリガーによってPrice_Auditsテーブルにもレコードが挿入されるはずです。確認してみましょう。

SELECT * FROM Price_Audits;

次のように返されます。

PostgreSQL トリガーを作成します。

トリガーは正常に機能しました。

PostgreSQL リストトリガー

で作成したすべてのトリガー PostgreSQL pg_trigger テーブルに保存されます。 にあるトリガーのリストを表示するには、 データベースでは、以下に示すように SELECT コマンドを実行してテーブルをクエリします。

SELECT tgname FROM pg_trigger;

これにより、次が返されます。

PostgreSQL リストトリガー

pg_trigger テーブルの tgname 列は、トリガーの名前を示します。

PostgreSQL ドロップトリガー

トリガーが不要になった場合は、簡単に削除できます。 PostgreSQL トリガーを削除するには、次の構文で DROP TRIGGER ステートメントを使用します。

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

トリガー名パラメーターは、削除するトリガーの名前を示します。

table-name は、トリガーを削除するテーブルの名前を示します。

IF EXISTS 句は、存在するトリガーを削除しようとします。 IF EXISTS 句を使用せずに存在しないトリガーを削除しようとすると、エラーが発生します。

CASCADE オプションを使用すると、トリガーに依存するすべてのオブジェクトを自動的に削除できます。

RESTRICT オプションを使用すると、オブジェクトがトリガーに依存している場合、トリガーは削除されません。

例:

テーブル Company の example_trigger という名前のトリガーを削除するには、次のコマンドを実行します。

DROP TRIGGER example_trigger IF EXISTS
ON Company;

pgAdminの使用

それでは、pgAdminを使ってこれら3つの操作を実行する方法を見ていきましょう。

でトリガーを作成する方法 PostgreSQL pgAdminを使用する

トリガーを作成する方法は次のとおりです。 PostgreSQL pgAdminを使用して:

ステップ 1) pgAdmin アカウントにログインします。

pgAdminを開き、認証情報を使用してアカウントにログインしてください。

ステップ 2) デモ データベースを作成する

  1. 左側のナビゲーション バーで、[データベース] をクリックします。
  2. 「デモ」をクリックします。

トリガーの作成 PostgreSQL pgAdminを使用する

ステップ 3) クエリを入力します。

Price_Audits テーブルを作成するには、エディタに次のクエリを入力します。

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

ステップ 4) クエリを実行する

「実行」ボタンをクリックします。

トリガーの作成 PostgreSQL pgAdminを使用する

ステップ 5) を実行します。 Code 監査関数用

次のコードを実行して、関数auditfuncを定義します。

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

ステップ 6) を実行します。 Code トリガーを作成する

次のコードを実行して、トリガー price_trigger を作成します。

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

ステップ 7) 新しいレコードを挿入する

  1. 次のコマンドを実行して、Price テーブルに新しいレコードを挿入します。
INSERT INTO Price
VALUES (3, 400)
  1. 次のコマンドを実行して、Price_Audits テーブルにレコードが挿入されたかどうかを確認します。
SELECT * FROM Price_Audits

これにより、以下が返されるはずです。

トリガーの作成 PostgreSQL pgAdminを使用する

ステップ8) テーブルの内容を確認する

Price_Auditsテーブルの内容を確認してみましょう。

pgAdmin を使用したトリガーの一覧表示

ステップ1) 次のコマンドを実行して、データベース内のトリガーを確認します。

SELECT tgname FROM pg_trigger

これにより、次が返されます。

pgAdmin を使用したトリガーの一覧表示

ドロップping pgAdminを使用したトリガー

テーブル Company の example_trigger という名前のトリガーを削除するには、次のコマンドを実行します。

DROP TRIGGER example_trigger IF EXISTS
ON Company

このチュートリアルで使用するデータベースをダウンロードする

よくあるご質問

BEFOREトリガーは行の変更が書き込まれる前に実行されるため、行を修正または拒否することができます。AFTERトリガーは変更が保存された後に実行されるため、ログ記録や監査タスクに適しています。

INSTEAD OFトリガーは、テーブルではなくビューに対して定義されます。INSERT、UPDATE、またはDELETEをカスタムロジックに置き換えることで、読み取り専用のビューを書き込み可能にします。

トリガー関数は通常、PL/pgSQLで記述されます。 PostgreSQL PL/もサポートしていますPythonPL/Perl、PL/Tcl、Cなど、様々な言語が用意されているので、自分のロジックに合った言語を選ぶことができます。

ALTER TABLE table-name DISABLE TRIGGER trigger-name を使用してトリガーを無効にし、ENABLE TRIGGER を使用して再度有効にします。これにより、ドロップを回避できます。ping そして、大量積載時にトリガーを再現する。

はい。トリガーは影響を受けるすべての行またはステートメントに処理を追加するため、トリガーのロジックが重いと書き込み速度が低下する可能性があります。トリガー関数は短くし、クエリ対象の列にはインデックスを作成してください。

はい。トリガーが、トリガーを持つ別のテーブルを変更すると、それらのテーブルも起動し、連鎖的にトリガーが実行されます。 PostgreSQL 無限ループを防ぐために、ネストの深さを制限します。

AIコーディングアシスタントは、平易な言語によるリクエストを完全なCREATE TRIGGERステートメントとトリガー関数に変換し、BEFOREまたはAFTERのタイミングを提案し、生成されたPL/pgSQLを説明することで、迅速なレビューを可能にします。

はい。pgaiやGPTベースのアシスタントなどのツールは、記述されたルールをトリガーSQLに変換し、新しいデータが到着した際に自動的にタグ付けや検証を行うINSERTトリガーを構築できます。