@Tometzky's oplossing klopt niet helemaal, althans met pg_dump
van 9.2 . Het maakt de tabel in het nieuwe schema, maar pg_dump
schema-kwalificeert de ALTER TABLE ... OWNER TO
verklaringen, dus die zullen mislukken:
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 |
U moet ook de dump bewerken om de schemakwalificatie op public.test
te verwijderen of verander het in de nieuwe schemanaam. sed
is hiervoor een handig hulpmiddel.
Ik had kunnen zweren dat de juiste manier om dit te doen was met pg_dump -Fc -n public -f dump.dbbackup
dan pg_restore
in een nieuw schema, maar ik kan er op dit moment niet precies achter komen hoe.
Update:Nee, het lijkt op sed
is uw beste keuze. Zie Ik wil de database herstellen met een ander schema