2

我有一个基于 MapServer 的 Web 应用程序,它使用 PostGIS 作为底层数据库扩展。现在我想要一个用于 MapServer 的专用数据库角色,因为我不想通过 postgres 超级用户访问数据库。这个角色应该只对公共表有 SELECT 权限(这很容易实现)和对公共 PostGIS 函数的 EXECUTE 权限。

出现了几个问题:是否所有 PostGIS 相关功能都存储在数据库的公共模式中,还是还有其他需要考虑的?

如何从数据库的 information_schema 或 pg_catalog 中提取所有函数信息 - 即函数名称、参数数量和名称?!对于 MapServerUser 语句的函数(args)上的 GRANT EXECUTE,我需要此信息!

先感谢您!!!

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 会自动获得对使用 SECURITY INVOKER 定义的函数的执行权限。

于 2010-10-07T14:33:37.240 回答