sql >> データベース >  >> RDS >> PostgreSQL

postgresqlですべてのテーブルのトリガーを作成するにはどうすればよいですか?

    データベース全体のトリガーの作成はありませんが、そのようなすべての一括管理操作では、手動で書き込む代わりに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の代わりに 。



    1. PostgreSQLの日付の違い

    2. mysqlパスワードPHPを使用したMySQLへの接続

    3. 異なるDBMS間のデータ移行

    4. PDO:ドライバーphp/mysqlが見つかりませんでした