web-dev-qa-db-ja.com

Postgresが関数の所有者を取得

関数名と関数所有者名のテーブルを取得できるようにしたいと思います。

現在、このクエリは指定されたスキーマの関数のリストを返します。

  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   |

誰かがこれを行う方法を説明できたら、私はとても感謝しています!

ありがとう

1
4x0v7

単純な方法と複雑な方法があります。

複雑な方法は、pg_rolesで結合し、そこからユーザー名を取得することです。

しかし、PostgreSQLハッカーは必要以上に入力したくないので、別の方法を考え出しました。

内部的には、すべてのオブジェクトはその名前(変更可能)ではなく、その「オブジェクトID」によって識別されます。これは、たとえば、pg_procproowner列で使用される数値です。

現在、いわゆる「 オブジェクト識別子タイプ 」があります。内部的には、そのようなタイプはoidですが、タイプの表示に使用されるタイプ出力関数は、それをオブジェクトの名前としてレンダリングします。

それをPostgreSQLの型キャスト演算子::と組み合わせると、次のことができます。

SELECT proname,
       proowner::regrole
FROM pg_proc
WHERE pronamespace::regnamespace::text = 'public';

追加のヒント:多分あなたはpronameよりもoid::regprocedureを好むでしょう。

2
Laurenz Albe