Rozwiązanie @Tometzky'ego nie jest do końca właściwe, przynajmniej z pg_dump
9.2 . Utworzy tabelę w nowym schemacie, ale pg_dump
schema-kwalifikuje ALTER TABLE ... OWNER TO
oświadczenia, więc te zakończą się niepowodzeniem:
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 |
Będziesz także musiał edytować zrzut, aby usunąć kwalifikację schematu na public.test
lub zmień go na nową nazwę schematu. sed
jest do tego przydatnym narzędziem.
Mogłem przysiąc, że prawidłowy sposób to zrobienie tego za pomocą pg_dump -Fc -n public -f dump.dbbackup
następnie pg_restore
w nowy schemat, ale nie mogę teraz dokładnie określić, jak.
Aktualizacja:Nie, wygląda jak sed
to twój najlepszy zakład. Zobacz Chcę przywrócić bazę danych z innym schematem