sql >> Database >  >> RDS >> PostgreSQL

Hoe een openbaar schema in een ander schema te herstellen

@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



  1. mysql niet uniek automatisch verhogen, primaire sleutel twee velden

  2. Hoe te controleren of een berekende kolom "persistent" is in SQL Server

  3. MySQL:retourneer alleen het laatste bericht in de platte/gespreksberichtentabel

  4. Een gegroepeerd rapport maken met de rapportwizard in Access 2016