2012-12-07 71 views

回答

36

使用pg_getfunctiondef;見system information functions。 PostgreSQL 8.4中添加了pg_getfunctiondef

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擴展。請參閱packaging extensions

+0

另外我想將這些函數還原到另一個db.How我可以這樣做。函數只需要恢復 – vmb

+0

@vmb輸出是SQL函數定義,因此將它們管入psql中。查看更新的答案。更好的是,創建一個擴展並將其打包。 –

+1

應該注意,'pg_get_functiondef('proc_name':: regproc)'**不會**轉儲函數的權限('GRANT'和'REVOKE'語句),有時候這些權限可能被認爲是函數定義的一部分。 – NumberFour

17

你不能告訴pg_dump只轉儲函數。但是,您可以創建沒有數據的轉儲(-s)並在恢復時對其進行過濾。請注意0​​部分:這將生成一個適用於pg_restore的文件。

先取轉儲:

pg_dump -U username -Fc -s -f dump_test your_database 

然後創建的功能列表:

pg_restore -l dump_test | grep FUNCTION > function_list 

最後恢復它們(-L指定上面創建的列表文件):

pg_restore -U username -d your_other_database -L function_list dump_test 
+0

也許前兩個命令可以簡化爲'pg_dump -U username -s database | grep FUNCTION> function_list' – Minutis

+0

@Minutis這不起作用,除非函數定義是_all_單行。 – dezso

+1

我自己試了一下,可以確認我的第一條評論中的解決方案不正確。 – Minutis