概要: この記事はPostgreSQLのトリガについて説明したものです。 異なるタイプのトリガーを説明し、それぞれの例を提供します。 トリガーの種類
2. トリガーの作成
1.INSERTイベントトリガー
2.トリガーの作成
3.トリガーの作成
4. UPDATEイベントトリガー
3. DELETEイベントトリガー
4. トリガーの削除
5. トリガの使用法
6. 重要な注意点
“トリガ “とは、動作のコースを設定するあらゆるイベントと定義されます。
PostgreSQLでは、INSERT、UPDATE、DELETE、TRUNCATEなどの特定のデータベースイベントで動作を行いたい場合、定義したイベントで必要となる機能を起動するのでトリガ機能は有用となります。
トリガは指定されたテーブル、ビュー、または外部テーブルと関連付けられ、特定の操作がそのテーブル上で実行されると、指定された関数を実行します。 要件に応じて、イベント/操作の前、後、または先にトリガーを作成することができます。 行レベルトリガー。 トリガがFOR EACH ROWとマークされている場合、トリガ関数はイベントによって変更される各行に対して呼び出されます。 例えば、テーブルの100行をUPDATEすると、UPDATEトリガ関数は100回呼ばれ、更新された各行に対して一度だけ呼ばれます。 FOR EACH STATEMENTオプションは、変更される行の数に関係なく、各ステートメントに対して1回だけトリガ関数を呼び出します。
トリガの作成
SQLコマンドCREATE TRIGGERは、指定したオブジェクトにトリガを作成します。
CREATE TRIGGERの構文は以下の通りです。
CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event }ON table_name ] transition_relation_name } ] { ROW | STATEMENT } ]EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments ) where event can be one of: INSERTUPDATE ]DELETETRUNCATE
より詳しい説明と利用可能なオプションについては、https://www.postgresql.org/docs/12/sql-createtrigger.htmlにあるPostgreSQLのドキュメントを確認してください。 INSERTイベントトリガ
新しいレコードがINSERT文を使用してテーブルに追加されると、INSERTイベントトリガが呼び出されます。
例
それでは、新しいトリガの作成例を見てみましょう。 この例では、次のように「Employee」という名前の新しいテーブルを作成します。
CREATE TABLE "Employee"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"Title" VARCHAR(30),"ReportsTo" INT,"BirthDate" TIMESTAMP,"HireDate" TIMESTAMP,"Address" VARCHAR(70),"City" VARCHAR(40),"State" VARCHAR(40),"Country" VARCHAR(40),"PostalCode" VARCHAR(10),"Phone" VARCHAR(24),"Fax" VARCHAR(24),"Email" VARCHAR(60),CONSTRAINT "PK_Employee" PRIMARY KEY ("EmployeeId"));CREATE TABLE "Employee_Audit"("EmployeeId" INT NOT NULL,"LastName" VARCHAR(20) NOT NULL,"FirstName" VARCHAR(20) NOT NULL,"UserName" VARCHAR(20) NOT NULL,"EmpAdditionTime" VARCHAR(20) NOT NULL,);
新しい社員レコードが「Employee」テーブルに挿入されると、「Employee_Audit」テーブルにエントリを追加できるトリガを作成するつもりです。
トリガー関数とCREATE TRIGGERコマンドを追加します。
CREATE OR REPLACE FUNCTION employee_insert_trigger_fnc() RETURNS trigger AS$$BEGIN INSERT INTO "Employee_Audit" ( "EmployeeId", "LastName", "FirstName","UserName" ,"EmpAdditionTime") VALUES(NEW."EmployeeId",NEW."LastName",NEW."FirstName",current_user,current_date);RETURN NEW;END;$$LANGUAGE 'plpgsql';CREATE TRIGGER employee_insert_trigger AFTER INSERT ON "Employee" FOR EACH ROW EXECUTE PROCEDURE employee_insert_trigger_fnc();
いったんテーブルに上記のINSERTトリガーを作成すると、これらの詳細で “Employee_Audit” テーブルに新しいエントリーを1つ追加します:
trigger_demo=# INSERT INTO "Employee" VALUES(10,' Adams','Andrew','Manager',1,'1962-02-18 00:00:00','2010-08-14 00:00:00','11120 Jasper Ave NW','Edmonton','AB','Canada','T5K 2N1','+1 780 428-9482','+1 780 428-3457','[email protected]');INSERT 0 1trigger_demo=# select * from "Employee" where "EmployeeId" =10;--------------------EmployeeId | 10LastName | AdamsFirstName | AndrewTitle | ManagerReportsTo | 1BirthDate | 1962-02-18 00:00:00HireDate | 2010-08-14 00:00:00Address | 11120 Jasper Ave NWCity | EdmontonState | ABCountry | CanadaPostalCode | T5K 2N1Phone | +1 780 428-9482Fax | +1 780 428-3457Email | [email protected]_demo=#trigger_demo=# select * from "Employee_Audit" ;----+-----------EmployeeId | 10LastName | AdamsFirstName | AndrewUserName | postgresEmpAdditionTime | 2019-11-10
2. UPDATEイベントトリガ
UPDATEイベントトリガはUPDATE文の実行時に呼び出されます。
例
CREATE TRIGGER verify_user_for_update BEFORE UPDATE ON "Employee" FOR EACH ROWEXECUTE PROCEDURE employee_verify_user_priv();
3. DELETEイベントトリガー
これはDELETEイベントトリガーで、レコードをDELETEするトランザクションで追加できます。
Example
CREATE TRIGGER employee_delete_trigger AFTER DELETE ON "Employee" FOR EACH ROW EXECUTE PROCEDURE aft_delete();
Dropping a Trigger
DROP TRIGGERはトリガーの削除に使用されます。
drop trigger employee_insert_trigger on "Employee" ;
トリガーの用途
1.トリガーを削除する
トリガーを削除する。 監査。 トリガーを使用して、イベントの詳細を記録することにより、テーブルトランザクションを追跡できます。
2. チェック制約の強制。 テーブルにトランザクションを適用する前に制約をチェックするトリガーを作成することができます。
Important Points To Remember
1.トリガーを使用して、新しいトランザクションレコード操作によってテーブルフィールドに自動入力することもできます。 テーブル上でトリガーを作成するには、ユーザはテーブル上でTRIGGER権限を持ち、トリガー関数でEXECUTE権限を持たなければなりません。
2. データベース内の既存のトリガー情報については、システムカタログ “pg_trigger” を確認できます。 同じイベントに対して同じオブジェクト上で複数のトリガーを作成すると、それらのトリガーは名前によるアルファベット順で起動されます。