前段
PoostgreSQL 10.6 (on docker)
で確認しています。
必要に迫られてDBからストアドファンクションのコードを取り出すことに。
pg_dump
で一括確保!も考えたのですが、関数毎にファイルが分かれないのでダンプファイルを解析する必要があり、それはとてもとても面倒なのでやめました。
本題
- 対象の関数名を取得する
ぐぐってヒットした記事
も試してみたのですが、どうもpostgreSQL由来の関数も大量にヒットしてしまうため、やめました。
結局原始的にpg_dump
で出力したダンプファイルを..
grep "CREATE FUNCTION" ./[ダンプファイル名].dump
という力技で解決。
シンプルが一番。
関数名さえとれればこっちのもの。
PostgreSQL の psql で関数のソースコードを取得する
http://everything-you-do-is-practice.blogspot.com/2017/09/postgresql-psql.html
こちらの方法に従ってソースコードを取り出せます。
ただ、これだとヘッダにpsql
の余計な出力、各行の末尾にも余計なスペースと+
がついてしまうので、sedで加工します。
sed -i -e "s/ *+$//" ./[エクスポートした関数].sql
これでそのままCREATEできるSQLができました。
以上の手順をまとめたスクリプトがこちら
# !/bin/bash
# export stored functions from database.
set -e
DB_HOST=[適切なホスト名]
DB_USER=[適切なユーザー名]
DB_NAME=[適切なDB名]
DB_CON="psql -t -h ${DB_HOST} -U ${DB_USER} ${DB_NAME}"
FUNCTIONS="\
function_name_1 \
function_name_2 \
"
for f in $FUNCTIONS
do
echo $f;
QUERY="SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${f}'));";
echo $QUERY | $DB_CON > "${f}.sql"
sed -i -e "s/ *+$//" ${f}.sql
done
ご参考まで。