関数名と関数所有者名のテーブルを取得できるようにしたいと思います。
現在、このクエリは指定されたスキーマの関数のリストを返します。
SELECT proname
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = '<%= schema_name %>';
ロールのIDを返すproowner
列があることがわかります。
https://www.postgresql.org/docs/10/catalog-pg-proc.html
私が欲しいのは所有者の名前を返すものです、私はまだテーブルなどを結合する方法を理解するのに十分なSQLをまだ知りません。
|function_name|function_owner|
______________________________
|func1 |func1_owner |
|func2 |func2_owner |
誰かがこれを行う方法を説明できたら、私はとても感謝しています!
ありがとう
単純な方法と複雑な方法があります。
複雑な方法は、pg_roles
で結合し、そこからユーザー名を取得することです。
しかし、PostgreSQLハッカーは必要以上に入力したくないので、別の方法を考え出しました。
内部的には、すべてのオブジェクトはその名前(変更可能)ではなく、その「オブジェクトID」によって識別されます。これは、たとえば、pg_proc
のproowner
列で使用される数値です。
現在、いわゆる「 オブジェクト識別子タイプ 」があります。内部的には、そのようなタイプはoid
ですが、タイプの表示に使用されるタイプ出力関数は、それをオブジェクトの名前としてレンダリングします。
それをPostgreSQLの型キャスト演算子::
と組み合わせると、次のことができます。
SELECT proname,
proowner::regrole
FROM pg_proc
WHERE pronamespace::regnamespace::text = 'public';
追加のヒント:多分あなたはproname
よりもoid::regprocedure
を好むでしょう。