回答:
私は後者の解決策を好みます。スキーマ名を次のファイル(1行に1つのスキーマ)に収集できますpsql
。
\o change_schema.sql
\t on
SELECT n.nspname
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema';
-- reset the output
\o
\t off
次に、以下を簡単に実行できます。
change_schema.sql
含めるスキーマを参照せずに、DDL変更スクリプト(など)を用意する
SET search_path TO :schema;
BEGIN;
...
...
ALTER TABLE orders
ADD COLUMN last_modified timestamp;
...
...
COMMIT;
次に、スキーマリストのすべての行を次のような行に変えることができます
psql -h dbhost -d targetdb -f change_schema.sql -v schema=<schema_name>
sed
たとえば、単純なコマンドで-次に、これらのコマンドを実行する必要があります。もちろん、必要に応じて適切なシェルスクリプトに変換できます。
EXECUTE
、ステートメントを動的SQLとして実行するために使用されるPL / PgSQLプロシージャとして記述することです。
完全を期すために、別のアプローチは、すべてのスキーマをループし、PL / PgSQLで動的SQLを使用して変更を実行することです。例:
DO
$$
DECLARE
schemaname name;
BEGIN
FOR schemaname IN SELECT nspname FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname <> 'information_schema' LOOP
EXECUTE format('ALTER TABLE %I.my_table ADD COLUMN blah blah;', schemaname);
END LOOP;
END;
$$ LANGUAGE plpgsql;
Postgres
代わりにPostgreSQL
完全に問題ありません。