Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ トリガ | トリガー、ウィンドウ関数、DCL
SQL最適化とクエリ機能

bookトリガ

メニューを表示するにはスワイプしてください

データベースにおけるトリガーは、特定のイベントやアクションがデータベース内で発生した際に自動的に実行される特別な種類のストアドプロシージャ。
これらのイベントには、テーブルへの挿入、更新、データ削除や、テーブルやビューなどのデータベーススキーマオブジェクトの変更が含まれる。

DMLトリガー

DMLトリガー(データ操作言語トリガー)は、テーブルまたはビューで特定のイベントが発生した際に指定されたアクションを自動的に実行するデータベースオブジェクト。
DMLトリガーは、ビジネスルールの強制、データ整合性の維持、監査タスクの実行などによく利用される。

DMLトリガーの種類

  • AFTERトリガー:これらのトリガーは、テーブルでトリガーとなるアクション(挿入、更新、削除)が実行された後に発火する;
  • BEFOREトリガー:これらのトリガーは、トリガーとなるアクションのに発火する。元のアクションをインターセプトし、独自のロジックを実行した上で、元のアクションを実行するかどうかを決定できる。

AFTERトリガーの例

本コースの最初のセクションで、BankAccountsテーブルとUserLogsテーブルに値を追加するトランザクションの例を紹介した。
今回はトランザクションの代わりに、AFTERテーブルのINSERT操作に対してBankAccountsトリガーを作成することで、同様の処理を実現できる。
その結果、新しいアカウントの挿入のみが可能となり、対応するログ値はトリガーによって自動的に追加される。

12345678910111213141516
-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
copy
Note
注意

PostgreSQLのトリガーにおいて、NEWテーブルに挿入または更新された新しい行を表す特別なレコード変数。トリガー関数内で新しい行のカラム値にアクセスできる。
削除された行を扱う場合は、OLDの代わりにNEWレコード変数を使用する必要がある。

BEFOREトリガーの例

負の口座残高を持つ値の追加を防止したいと仮定します。これを実現するためにBEFOREトリガーを作成できます。このトリガーは操作前に残高を確認し、負の場合は操作が実行されません。

12345678910111213141516171819202122232425
-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
copy

トリガー作成パターン

トリガー作成の一般的なパターンとして、最初に特定のロジックを操作の前後で実行する関数を定義します。その後、この関数を指定したテーブルとアクションにトリガーとして関連付けます。

以下の文に注意してください:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

UPDATE操作の代わりにDELETEINSERTを利用することも可能です。
ただし、注意点として、SELECT文はテーブル内の行を変更しないため、SELECTトリガーは作成できません!

question mark

データベースでトリガーを使用する主な目的は何ですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  1

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  1
some-alt