@Tometzkys løsning er ikke helt rigtig, i hvert fald med 9.2's pg_dump . Det vil oprette tabellen i det nye skema, men pg_dump skemaet kvalificerer ALTER TABLE ... OWNER TO udsagn, så de mislykkes:
postgres=# CREATE DATABASE demo;
\cCREATE DATABASE
postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# CREATE TABLE public.test ( dummy text );
CREATE TABLE
demo=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | test | table | postgres
(1 row)
demo=# \q
$
$ pg_dump -U postgres -f demo.sql demo
$ sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = testschema, pg_catalog;/' demo.sql
$ grep testschema demo.sql
SET search_path = testschema, pg_catalog;
$ dropdb -U postgres demo
$ createdb -U postgres demo
$ psql -U postgres -c 'CREATE SCHEMA testschema;' demo
CREATE SCHEMA
$ psql -U postgres -f demo.sql -v ON_ERROR_STOP=1 -v QUIET=1 demo
psql:demo.sql:40: ERROR: relation "public.test" does not exist
$ psql demo
demo=> \d testschema.test
Table "testschema.test"
Column | Type | Modifiers
--------+------+-----------
dummy | text |
Du skal også redigere dumpet for at fjerne skemakvalifikationen på public.test eller ændre det til det nye skemanavn. sed er et nyttigt værktøj til dette.
Jeg kunne have svoret, at den rigtige måde at gøre dette på var med pg_dump -Fc -n public -f dump.dbbackup derefter pg_restore ind i et nyt skema, men jeg kan tilsyneladende ikke finde ud af præcis hvordan lige nu.
Opdatering:Nej, det ligner sed er dit bedste bud. Se Jeg vil gendanne databasen med et andet skema