データベース全体のトリガーの作成はありませんが、そのようなすべての一括管理操作では、手動で書き込む代わりにPostgreSQLシステムテーブルを使用してクエリを生成できます。この場合、次のコマンドを実行できます。
SELECT
'CREATE TRIGGER '
|| tab_name
|| ' BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();' AS trigger_creation_query
FROM (
SELECT
quote_ident(table_schema) || '.' || quote_ident(table_name) as tab_name
FROM
information_schema.tables
WHERE
table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_schema NOT LIKE 'pg_toast%'
) tablist;
これにより、次のようなSQLコマンドである文字列のセットが取得されます。
CREATE TRIGGER schema1.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table2 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema1.table3 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2.table1 BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
CREATE TRIGGER schema2."TABLE2" BEFORE DELETE ON ALL DATABASE FOR EACH ROW EXECUTE PROCEDURE delete_data();
...
etc
それらを一度に実行する必要があります(psql
のいずれかによって) またはpgAdmin)。
ここでいくつかの説明:
-
information_schema.tables
を使用してデータベース内のテーブルの名前を選択します システムテーブル。文字通りすべてのテーブルのデータがあるため、pg_catalog
を除外することを忘れないでください およびinformation_schema
select
からのスキーマとトーストテーブル 。 -
quote_ident(text)
を使用します 文字列を二重引用記号の中に入れる関数(""
)必要に応じて(つまり、スペースまたは大文字の名前にはそれが必要です)。 - テーブル名のリストがある場合は、それらを静的文字列と連結してSQLコマンドを取得します。
- ここで何が起こっているのかをよりよく理解してもらいたいので、サブクエリを使用してそのコマンドを記述します。
quote_ident(table_schema) || '.' || quote_ident(table_name)
tab_name
の代わりに 。