私の PostgreSQL 9.1 データベースには、複数のテーブルと 1 つのトリガー関数があります。
現在、そのトリガー関数を使用して、各テーブルのトリガーを作成しています。
この方法論はうまく機能しています。上司から、そのトリガー関数を再利用してトリガーを共通に (1 回だけ) 作成するように依頼されました。その 1 つのトリガー関数が、データベース内のすべてのテーブルで使用されるはずです。
私の PostgreSQL 9.1 データベースには、複数のテーブルと 1 つのトリガー関数があります。
現在、そのトリガー関数を使用して、各テーブルのトリガーを作成しています。
この方法論はうまく機能しています。上司から、そのトリガー関数を再利用してトリガーを共通に (1 回だけ) 作成するように依頼されました。その 1 つのトリガー関数が、データベース内のすべてのテーブルで使用されるはずです。
PL/PgSQL を使用して動的 SQL でトリガーを作成する例は、PostgreSQL の監査トリガーサンプルにあります。同じアプローチは、他の DDL でも機能します。
andの機能audit.audit_table
と使用法を参照format
してくださいEXECUTE
。
とは言っても、手続き的にテーブルを作成する必要があるということは、スキーマ設計に問題がある兆候である可能性があります (常にそうとは限りません)。
テーブルを作成する動的 SQL の簡単な例:
CREATE OR REPLACE FUNCTION demo_dynamic_table(tablename text) RETURNS void AS $$
BEGIN
EXECUTE format('CREATE TABLE %I (id serial primary key);', tablename);
END;
$$ LANGUAGE plpgsql;
トリガーの作成などでも同じアプローチが機能します。
テーブル作成用の PL/pgSQL プロシージャを作成し、その中にトリガー作成コードを移動できます