PostgreSQL Triggers are database callback functions, which are automatically performed/invoked when a specified database event occurs.
PostgreSQLトリガーについての重要なポイントは次のとおりです。
-
PostgreSQLトリガーは、行に対して操作が試行される前(制約がチェックされ、挿入、更新、または削除が試行される前)
-
操作が完了した後(制約がチェックされ、挿入、更新、または削除が完了した後)
-
操作の代わりに(制約がチェックされ、挿入、更新、または削除が完了した後)
-
ビューに対する挿入、更新、または削除の場合)
各行に対してマークされたトリガーは、その行ごとに一度呼び出されます。 操作が変更されます。 対照的に、各ステートメントに対してマークされたトリガーは、変更する行の数に関係なく、特定の操作に対して一度だけ実行されます。WHEN句とトリガーアクションの両方が、NEW形式の参照を使用して、挿入、削除、または更新される行の要素にアクセスできます。列-名前と古い。ここで、column-nameは、トリガーが関連付けられているテーブルの列の名前です。WHEN句が指定された場合、指定されたPostgreSQLステートメントは、WHEN句がtrueである行に対してのみ実行されます。 WHEN句が指定されていない場合、PostgreSQLステートメントはすべての行に対して実行されます。
同じ種類の複数のトリガーが同じイベントに対して定義されている場合、それらは名前のアルファベット順に起動されます。
BEFORE、AFTER、またはINSTEAD OFキーワードは、関連する行の挿入、変更、または削除に関連してトリガーアクションが実行されるタイミングを決定します。
トリガーは、関連付けられているテーブルが削除されると自動的に削除されます。変更するテーブルは、トリガーがアタッチされているテーブルまたはビューと同じデータベースに存在し、databaseではなくtablenameだけを使用する必要があります。テーブル名。
制約オプションを指定すると、制約トリガーが作成されます。 これは、SET CONSTRAINTSを使用してトリガーの起動タイミングを調整できることを除いて、通常のトリガーと同じです。 制約トリガーは、実装されている制約に違反した場合に例外を発生させることが期待されます。
構文
トリガーを作成する基本的な構文は次のとおりです−
CREATE TRIGGER trigger_name event_nameON table_name;
ここで、event_nameは、前述のテーブルtable_nameに対するINSERT、DELETE、UPDATE、およびTRUNCATEデー 必要に応じて、テーブル名の後に各行を指定できます。
次のように、テーブルの指定された1つ以上の列に対する更新操作でトリガーを作成する構文です−
CREATE TRIGGER trigger_name UPDATE OF column_nameON table_name;
例
COMPANYテーブルに挿入されているすべてのレコードに対して監査トライアルを保持したい場合を考えてみましょう。
testdb=# CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL);
監査トライアルを維持するために、我々は新しいレコードの会社テーブルのエントリがあるたびにログメッセージが挿入されるAUDITと呼ばれる新….. だから今、私たちは次のように会社のテーブルにトリガーを作成してみましょう−
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANYFOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
auditlogfunc()はPostgreSQLプロシージャであり、次の定義を持っています−
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$ BEGIN INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp); RETURN NEW; END;$example_table$ LANGUAGE plpgsql;
さて、実際の作業を開始します。 会社テーブルにレコードを挿入して、監査テーブルに監査ログレコードを作成する必要があります。 だから、私たちは次のように会社のテーブルに一つのレコードを作成してみましょう−
testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1, 'Paul', 32, 'California', 20000.00 );
これは、次のように会社のテーブルに一つのレコー このレコードは、会社テーブルのINSERT操作で作成したトリガーの結果です。 同様に、要件に基づいて、更新操作と削除操作でトリガーを作成できます。P>
emp_id | entry_date--------+------------------------------- 1 | 2013-05-05 15:49:59.968+05:30(1 row)
トリガーのリスト
次のようにpg_triggerテーブルから現在のデータベース内のすべてのトリガーをリストダウンすることができます−
testdb=# SELECT * FROM pg_trigger;
上記のPostgreSQLステートメントは、すべてのトリガーをリストダウンします。
特定のテーブルのトリガーをリストしたい場合は、次のようにテーブル名でAND句を使用します−
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
上記のPostgreSQLステートメントは、次のように一つ−
testdb=# DROP TRIGGER trigger_name;