如何自动化postgres导入和导出函数和视图

时间:2013-03-13 17:49:35

标签: database postgresql

我在遗留系统中使用PostgreSQL数据库获得了一些项目,它使用了19个存储过程(函数),以及大约70个视图。

现在,我们对实时数据库进行了一些更新,并且由于postgres限制并且需要删除并重新创建所有函数和视图,因为函数已更改,我们花了相当多的时间来完成此操作。

是否有一种自动更改postgress中的函数和视图的方式,它以一种照顾依赖关系并按正确顺序执行的方式。

我们有基本的视图,然后创建上层视图......它有点复杂的数据库,至少对我来说:)

由于

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是将数据库备份到文本文件:

pg_dump database_name > database_name.pg_dump

它们将处于正确的依赖顺序中,否则从备份恢复数据库将很困难。您可以编辑备份文件中的功能和视图定义,并将其还原回新数据库。

如果数据库备份文件太大而无法在编辑器中编辑,可以从Postgres 9.2中将其拆分为3个部分:

pg_dump --section=pre-data > database_name.1.pg_dump
pg_dump --section=data > database_name.2.pg_dump
pg_dump --section=post-data > database_name.3.pg_dump

您只会编辑第一部分,这部分很小。在旧版本中,您可以使用例如split实用程序。

如果您无法承受备份和恢复所需的停机时间,则会变得更加棘手。但我仍然建议使用备份文件。请记住,Postgres在事务中支持DDL - 如果您在事务中导入函数和视图并且会出现错误,您可以简单地回滚所有更改,进行更正并重试。

答案 1 :(得分:0)

没有“简单”的方式。最好的方法是首先准备IMO,然后使用SQL脚本和版本控制设置一种方法。

我们在LedgerSMB中做的是将函数定义保存在一系列.sql文件中,这些文件在subversion中被跟踪。然后我们有一个重新加载它们的脚本。如果您之前没有这样做,这将需要一些工作。最简单的方法是:

pg_dump -s > ddl_statements_for_mydb.sql

然后您可以复制/粘贴函数定义(将CREATE更改为CREATE OR REPLACE或在适当的位置添加DROP IF EXISTS)。然后,您将需要模块化为可用的块并具有一个脚本,以正确的顺序将所有块重新加载到您的数据库中。现在设置所有内容的时间和精力将节省很多次,因为您可以以可预测的方式将更改应用于测试,登台和生产帐户,而且没有明显的停机时间(甚至可能根本没有停机时间取决于如何你构建它。)