9

SQLクエリを介してすべてのユーザー定義関数のリストを取得する方法は?


このコードはここにあります

SELECT p.proname, p.pronargs, t.typname
 FROM pg_proc p, pg_language l, pg_type t
 WHERE p.prolang = l.oid
 and p.prorettype = t.oid
 and l.lanname = 'c'
ORDER BY proname;

しかし、これはC関数を取得します

たとえば、言語で記述された、ユーザー定義の手続き型言語関数を取得する方法はplpgsql ?

4

1 に答える 1

29

検討:

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

于 2013-05-19T07:01:33.727 に答える