如何仅在Postgres中备份功能

vmb*_*vmb 25 sql postgresql postgresql-9.1

我想备份我的postgres数据库中的所有函数.如何只在Postgres中备份函数?

Cra*_*ger 54

使用pg_getfunctiondef; 查看系统信息功能.pg_getfunctiondef在PostgreSQL 8.4中添加了.

SELECT pg_get_functiondef('proc_name'::regproc);
Run Code Online (Sandbox Code Playgroud)

要转储模式中的所有函数,可以查询系统表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';
Run Code Online (Sandbox Code Playgroud)

将上述内容更改为"从所有模式开始,除了那些开头的pg_",如果这就是你想要的那样,这是微不足道的.

psql你可以转储这与文件:

psql -At dbname > /path/to/output/file.sql <<"__END__"
... the above SQL ...
__END__
Run Code Online (Sandbox Code Playgroud)

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

psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name
Run Code Online (Sandbox Code Playgroud)

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

  • 应该注意的是,`pg_get_functiondef('proc_name':: regproc)`**不要**转储函数的特权(`GRANT`和`REVOKE`语句),这些特权有时可能被认为是函数定义的一部分. (5认同)
  • 请注意,这不会转储聚合函数。它将产生一个错误(“错误:X 是一个聚合函数”)。您需要添加“and f.proisagg is false”来排除这些。 (2认同)

dez*_*zso 29

你不能告诉pg_dump只转储功能.但是,您可以在没有data(-s)的情况下进行转储,并在还原时对其进行过滤.注意-Fc部分:这将产生适合的文件pg_restore.

首先采取转储:

pg_dump -U username -Fc -s -f dump_test your_database
Run Code Online (Sandbox Code Playgroud)

然后创建一个函数列表:

pg_restore -l dump_test | grep FUNCTION > function_list
Run Code Online (Sandbox Code Playgroud)

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

pg_restore -U username -d your_other_database -L function_list dump_test
Run Code Online (Sandbox Code Playgroud)