我有一些使用 PostgreSQL 数据库的项目,它使用 19 个存储过程(函数)和大约 70 个视图。
现在,我们对实时数据库进行了一些更新,并且由于 postgres 的限制以及需要删除和重新创建所有函数和视图,函数发生了变化,我们花了相当长的时间来做这件事。
是否有一种自动化的方式来改变 postgress 中的函数和视图,以一种关心依赖关系并以正确的顺序执行的方式。
我们有基本视图,然后创建上层视图......它有点复杂的数据库,至少对我来说:)
谢谢
我有一些使用 PostgreSQL 数据库的项目,它使用 19 个存储过程(函数)和大约 70 个视图。
现在,我们对实时数据库进行了一些更新,并且由于 postgres 的限制以及需要删除和重新创建所有函数和视图,函数发生了变化,我们花了相当长的时间来做这件事。
是否有一种自动化的方式来改变 postgress 中的函数和视图,以一种关心依赖关系并以正确的顺序执行的方式。
我们有基本视图,然后创建上层视图......它有点复杂的数据库,至少对我来说:)
谢谢
我认为最简单的方法是将数据库备份到文本文件:
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 — 如果您在事务中导入函数和视图并且会出现错误,您可以简单地回滚所有更改,进行更正并重试。
没有“简单”的方法。IMO 最好的方法是首先做好准备,然后使用 SQL 脚本和版本控制来设置方法。
我们在 LedgerSMB 中所做的是将函数定义保存在一系列 .sql 文件中,这些文件在 subversion 中进行跟踪。然后我们有一个重新加载它们的脚本。如果您以前没有这样做,这将需要一些工作来设置。最简单的方法是:
pg_dump -s > ddl_statements_for_mydb.sql
然后您可以复制/粘贴函数定义(将 CREATE 更改为 CREATE OR REPLACE 或在适当的地方添加 DROP IF EXISTS)。然后你会想要模块化成可用的块,并有一个脚本以正确的顺序将所有块重新加载到你的数据库中。现在设置所有内容所花费的时间和精力将在未来节省很多倍,因为您可以以可预测的方式将更改应用到测试、暂存和生产帐户,而没有明显的停机时间(甚至可能根本没有停机时间,具体取决于如何你构建它)。