0

有没有一种自动化的方法来获取 postgresql数据库并将其转换为可以加载到新数据库中的 postgresql模式?

我玩弄了这个,找到了两种方法来做我想做的事,但老实说,这两种方法都很麻烦:

  1. 使用 plain 选项在数据库上执行 pg_dump,作为脚本的一部分,然后运行一些 sed tomfoolery 进行相应的更改。然而,这是在乞求痛苦和错误。

  2. 通过 psql 将数据库模式中的所有表、序列、数据等传输到新模式名称中,然后仅转储/恢复该模式/数据。

我可能会选择选项二,但有没有人有更简单的方法来做到这一点?如果我们从头开始生成这些东西,这当然是微不足道的,但很可能我们将不得不以这种方式转换多个系统上的现有数据库。

编辑:稍后阅读此内容的人的澄清。我试图从本质上获取数据库“A”的公共架构并将其转储/恢复到数据库“B”上的新命名架构中。数据库“B”可能会或可能不会将其公共模式用于其他事情,因此需要在不更改/更改数据库“B”上公共模式中的任何潜在数据的情况下进行传输。

4

1 回答 1

0

由于您不能拥有嵌套模式,因此我假设您想要获取 db A 中的公共模式并将其放入 db B 中的命名模式中。

这是执行此操作的简单方法(可能需要一些努力search_path才能正确找到所有内容,尤其是关于功能,但请参阅下面的注释。

  1. 从 DB A 转储您的数据库。将其还原到数据库 B

  2. 在 db B 上运行以下命令:

    ALTER SCHEMA public RENAME TO foobar;
    
  3. 然后您可以更改一些用户以首先在 foobar 中搜索关系和函数:

    ALTER USER myuser SET search_path=foobar,public;
    
  4. 如果您有功能,您可以:

    ALTER FUNCTION foo(bar int) SET search_path=foobar;
    

我认为这涵盖了基础知识。

现在,如果您不能确定公共模式正在使用中,您可能需要查阅 pg_class 和 pg_namespace 来尝试确定涉及哪个模式。您可以通过检查特定表的命名空间并尝试确保只涉及一个模式来做到这一点。如果相同的表名出现在多个模式中,并且是您用来检测的表名,那么您将需要手动干预。

于 2013-10-30T03:33:16.020 回答