30

我想备份我的 postgres 数据库中的所有功能。如何仅在 Postgres 中备份功能?

4

2 回答 2

70

使用pg_getfunctiondef;见系统信息功能pg_getfunctiondef在 PostgreSQL 8.4 中添加。

SELECT pg_get_functiondef('proc_name'::regproc);

要转储模式中的所有函数,您可以查询系统表pg_catalog;说如果你想要一切public

SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';

如果您想要的话,将上面的内容更改为“除了以开头的所有模式之外的所有模式都是微不足道的。pg_

psql您可以将其转储到文件中:

psql -At dbname > /path/to/output/file.sql <<"__END__"
... the above SQL ...
__END__

要在另一个数据库中运行输出,请使用以下内容:

psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name

但是,如果您要在这样的 DB 之间复制函数,请考虑将函数定义的授权副本作为 SQL 脚本存储在 svn 或 git 等修订控制系统中,最好打包为 PostgreSQL 扩展。请参阅包装扩展

于 2012-12-07T07:58:48.863 回答
33

你不能告诉pg_dump只转储函数。但是,您可以在没有数据的情况下进行转储(-s--schema-only)并在还原时对其进行过滤。注意--format=c(也-Fc)部分:这将生成一个适合pg_restore.

首先进行转储:

pg_dump -U username --format=c --schema-only -f dump_test your_database

然后创建一个函数列表:

pg_restore --list dump_test | grep FUNCTION > function_list

最后恢复它们(-L--use-list指定上面创建的列表文件):

pg_restore -U username -d your_other_database -L function_list dump_test
于 2012-12-07T06:53:25.580 回答