如何在PostgreSQL中复制模式

问题描述 投票:17回答:6

我有一个具有模式publicschema_A的数据库。我需要使用与schema_b相同的结构创建一个新模式schema_a。我在下面找到了该函数,问题是它没有复制外键约束。

CREATE OR REPLACE FUNCTION clone_schema(source_schema text, dest_schema text)
  RETURNS void AS
$BODY$
DECLARE
  object text;
  buffer text;
  default_ text;
  column_ text;
BEGIN
  EXECUTE 'CREATE SCHEMA ' || dest_schema ;

  -- TODO: Find a way to make this sequence's owner is the correct table.
  FOR object IN
    SELECT sequence_name::text FROM information_schema.SEQUENCES WHERE sequence_schema = source_schema
  LOOP
    EXECUTE 'CREATE SEQUENCE ' || dest_schema || '.' || object;
  END LOOP;

  FOR object IN
    SELECT table_name::text FROM information_schema.TABLES WHERE table_schema = source_schema
  LOOP
    buffer := dest_schema || '.' || object;
    EXECUTE 'CREATE TABLE ' || buffer || ' (LIKE ' || source_schema || '.' || object || ' INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING DEFAULTS)';

    FOR column_, default_ IN
      SELECT column_name::text, REPLACE(column_default::text, source_schema, dest_schema) FROM information_schema.COLUMNS WHERE table_schema = dest_schema AND table_name = object AND column_default LIKE 'nextval(%' || source_schema || '%::regclass)'
    LOOP
      EXECUTE 'ALTER TABLE ' || buffer || ' ALTER COLUMN ' || column_ || ' SET DEFAULT ' || default_;
    END LOOP;
  END LOOP;

END;
$BODY$  LANGUAGE plpgsql

如何使用外键约束克隆/复制schema_A

postgresql database-schema foreign-key-relationship postgresql-9.1
6个回答
25
投票

您可能不使用文件就可以从命令行完成:

pg_dump -U user --schema='fromschema' database | sed 's/fromschmea/toschema/g' | psql -U user -d database

[Note,它将搜索并替换所有出现的作为您的架构名称的字符串,因此,它可能会影响您的数据


14
投票

我将使用pg_dump转储不含数据的模式:

pg_dump

仅转储对象定义(模式),而不转储数据。

此选项是-s --schema-only 的倒数。它与指定--data-only类似,但由于历史原因不相同。--section=pre-data --section=post-data选项混淆,该选项以不同的含义使用单词“ schema”。]

[仅排除数据库中表的子集的表数据,请参见--schema

--exclude-table-data

然后重命名转储中的架构(搜索和替换),并用pg_dump $DB -p $PORT -n $SCHEMA -s -f filename.pgsql
还原它。

psql

other
模式中的

外键约束引用表被复制以指向相同的模式。对same模式中的表的引用指向复制的模式中的各个表。


4
投票
聚会晚了一点,但是这里的一些sql可能会帮助您:

4
投票
我将为我的问题分享一个解决方案,只是增加一小部分。我需要克隆一个架构,创建一个新的数据库用户,并将新架构中所有对象的所有权分配给该用户。

0
投票
来源:

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.