2012-12-07 9 views

答えて

36

使用pg_getfunctiondef; system information functionsを参照してください。 pg_getfunctiondefがPostgreSQL 8.4で追加されました。あなたはpg_catalogでシステムテーブルを照会することができ、スキーマ内のすべての機能をダンプする

SELECT pg_get_functiondef('proc_name'::regproc); 

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_で始まるものを除くすべてのスキーマから」を言うために上記を変更するには些細です:あなたはpublicからすべてを望んでいた場合は言います。 psql

あなたがファイルにこれをダンプすることができます:あなたはのDB等との機能を複製している場合

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

:ようなものを使用し、別のDBに出力を実行するには

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

ただし、svnやgitのようなリビジョン管理システムにSQLスクリプトとして関数定義のオーサリングコピーを格納することをお勧めします。これは、PostgreSQL拡張としてパッケージ化することが望ましいです。 packaging extensionsを参照してください。

+0

また、これらの関数を別のdbに復元したいのですがどうすればいいですか?関数は復元する必要があります – vmb

+0

@vmb出力はSQL関数定義なので、それらをpsqlにパイプします。更新された回答をご覧ください。さらに、エクステンションを作成してパッケージ化してください。 –

+1

'pg_get_functiondef( 'proc_name' :: regproc)' **は、関数定義の一部とみなされることがある関数の特権( 'GRANT'と' REVOKE'文)をダンプしません。 – NumberFour

17

pg_dumpに機能のみをダンプするように指定することはできません。ただし、データなしでダンプを作成し(-s)、リストア時にフィルタリングすることができます。 -Fcの部分に注意してください:pg_restoreに適したファイルが生成されます。

まずダンプを取る:

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

は、次に関数のリストを作成します。

pg_restore -U username -d your_other_database -L function_list dump_test 

pg_restore -l dump_test | grep FUNCTION > function_list 

そして最後には、それらを(-Lは、上記で作成したリストファイルを指定します)を復元します

+0

おそらく、最初の2つのコマンドを 'pg_dump -U username -s database | grep FUNCTION> function_list' – Minutis

+0

@Minutis関数定義が_all_ one-linersでない限り、動作しません。 – dezso

+1

これを自分で試してみて、最初のコメントの解決方法が間違っていることを確認できます。 – Minutis

関連する問題