Answers:
我更喜欢后一种解决方案。您可以在以下位置将模式名称收集到一个文件中(每行一个模式)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
然后,您可以轻松地执行以下操作:
使用DDL更改脚本(例如,change_schema.sql
),而不引用包含模式
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
例如,使用一个简单的命令-然后您只需要运行这些命令即可。当然,您可以根据需要将其转换为适当的Shell脚本。
EXECUTE
将语句作为动态SQL运行。
为了完整起见,另一种方法是遍历所有模式并使用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
完全可以。