sql >> データベース >  >> RDS >> PostgreSQL

パブリックスキーマを別のスキーマに復元する方法

    @Tometzkyのソリューションは、少なくとも9.2のpg_dumpでは、完全には正しくありません。 。新しいスキーマにテーブルが作成されますが、pg_dump スキーマ-ALTER TABLE ... OWNER TOを修飾します ステートメントなので、それらは失敗します:

    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 | 
    

    また、ダンプを編集して、public.testのスキーマ修飾を削除する必要があります。 または、新しいスキーマ名に変更します。 sed これには便利なツールです。

    これを行う正しい方法は、pg_dump -Fc -n public -f dump.dbbackupを使用することでした。 次にpg_restore 新しいスキーマに変換しますが、現時点で正確にどのようになっているのかわかりません。

    更新:いいえ、sedのようです あなたの最善の策です。 別のスキーマでデータベースを復元したい を参照してください。



    1. OracleのCURRENT_TIMESTAMP関数は本当に関数ですか?

    2. MySQL:すべての属性がリストされている製品を入手する

    3. MySQLクエリの転置-行を列に変換する必要があります

    4. Oracle ODP.NET接続文字列:データソースには何が入りますか?