トリガ
メニューを表示するにはスワイプしてください
データベースにおけるトリガーは、特定のイベントやアクションがデータベース内で発生した際に自動的に実行される特別な種類のストアドプロシージャ。
これらのイベントには、テーブルへの挿入、更新、データ削除や、テーブルやビューなどのデータベーススキーマオブジェクトの変更が含まれる。
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();
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();
トリガー作成パターン
トリガー作成の一般的なパターンとして、最初に特定のロジックを操作の前後で実行する関数を定義します。その後、この関数を指定したテーブルとアクションにトリガーとして関連付けます。
以下の文に注意してください:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
UPDATE操作の代わりにDELETEやINSERTを利用することも可能です。
ただし、注意点として、SELECT文はテーブル内の行を変更しないため、SELECTトリガーは作成できません!
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください