検討:
select
pp.proname,
pl.lanname,
pn.nspname,
pg_get_functiondef(pp.oid)
from pg_proc pp
inner join pg_namespace pn on (pp.pronamespace = pn.oid)
inner join pg_language pl on (pp.prolang = pl.oid)
where pl.lanname NOT IN ('c','internal')
and pn.nspname NOT LIKE 'pg_%'
and pn.nspname <> 'information_schema';
参照: postgresql で既存の関数のスクリプトを検索するコマンドは何ですか?
pg_get_functiondef
またはprosrc
列をpg_proc
直接使用します。重要なアイデアはpg_namespace
、PostgreSQL カタログ関数に参加して除外することです。これは、おそらくほとんどの目的に適しています。
FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'
ユーザー定義関数のソース コードを取得する際の問題は、ユーザーが何を意味するかを判断することです。多くのタイプの関数を作成できます。
- を使用した関数
CREATE EXTENSION
。
- PostgreSQL によって作成された関数。
- 管理者によってコンパイルおよびインストールされた関数。
十分な権限を持つスーパーユーザーは で関数を定義できますpg_proc
が、通常はできません。
スーパーユーザーのみが C 言語関数を作成できるため、それらを除外します。このような機能は、管理者が特定のデータベースにカスタム インストールできますが、通常のユーザーはインストールできません。