sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan gendanner du offentligt skema til et andet skema

@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



  1. Brug af union og orden efter klausul i mysql

  2. Kan jeg være sikker på Last Insert Id af Mysql?

  3. Hvorfor forårsager denne MySQL-udløser et stackoverløb?

  4. PHP/MySQL - algoritme for topbedømte