2

PostGIS を基になるデータベース拡張として使用する MapServer に基づく Web アプリケーションがあります。Postgres スーパーユーザー経由でデータベースにアクセスしたくないので、MapServer に使用される専用のデータベース ロールが必要です。このロールには、パブリック テーブルに対する SELECT 権限 (これは簡単に達成できます) と、パブリック PostGIS 関数に対する EXECUTE 権限のみが必要です。

いくつかの疑問が生じます: すべての PostGIS 関連関数はデータベースのパブリック スキーマに格納されていますか? それとも他に考慮すべきことはありますか?

データベースの information_schema または pg_catalog からすべての関数情報 (つまり、関数名、引数の数、名前) を抽出するにはどうすればよいですか?! GRANT EXECUTE on function(args) to MapServerUser ステートメントにこの情報が必要です!

前もって感謝します!!!

4

1 に答える 1

2

PostgreSQL 8.4.xの場合:

SELECT n.nspname as "Schema",
  p.proname as "Name",
  pg_catalog.pg_get_function_result(p.oid) as "Result data type",
  pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
  WHEN p.proisagg THEN 'agg'
  WHEN p.proiswindow THEN 'window'
  WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
  ELSE 'normal'
END as "Type"
FROM pg_catalog.pg_proc p
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
     AND n.nspname <> 'pg_catalog'
  AND n.nspname <> 'information_schema'
ORDER BY 1, 2, 4;

-Eパラメーター(非表示のクエリを表示)を指定してpsqlを実行し、\dfコマンドを実行することで検出されます。

また、PostgreSQLの「パブリック」スキーマはそのように名付けられています。特別な意味はありません。それは悪い名前です。注意する必要があるのは、「公開」の役割(すべて大文字)です。テーブルには自動的にPUBLICロールが付与されませんが、私の経験では、PUBLICはSECURITYINVOKERで定義された関数の実行権限を自動的に取得します。

于 2010-10-07T14:33:37.240 に答える