PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So stellen Sie ein öffentliches Schema in einem anderen Schema wieder her

Die Lösung von @Tometzky ist nicht ganz richtig, zumindest mit pg_dump von 9.2 . Es erstellt die Tabelle im neuen Schema, aber pg_dump Schema-qualifiziert ALTER TABLE ... OWNER TO Anweisungen, also werden diese fehlschlagen:

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 | 

Sie müssen auch den Dump bearbeiten, um die Schemaqualifizierung auf public.test zu entfernen oder ändern Sie ihn in den neuen Schemanamen. sed ist ein nützliches Werkzeug dafür.

Ich hätte schwören können, dass dies mit pg_dump -Fc -n public -f dump.dbbackup richtig gemacht wurde dann pg_restore in ein neues Schema, aber ich kann momentan nicht genau herausfinden, wie.

Update:Nein, es sieht aus wie sed ist Ihre beste Wette. Siehe Ich möchte die Datenbank mit einem anderen Schema wiederherstellen