検討してください:
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言語関数を作成できるため、それらを除外します。このような機能は、管理者が特定のデータベースにカスタムインストールできますが、通常のユーザーはインストールできません。