@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