我有一个基于MapServer的Web应用程序,它使用PostGIS作为底层数据库扩展。现在我想拥有一个用于MapServer的专用数据库角色,因为我不想通过postgres超级用户访问数据库。此角色应该只对公共表具有SELECT权限(这很容易实现)和对公共PostGIS功能的EXECUTE权限。
出现了几个问题:所有PostGIS相关功能都存储在数据库的公共模式中还是还有其他需要考虑的问题?
如何从information_schema或数据库的pg_catalog中提取所有函数信息 - 即函数名称,参数的数量和名称?我需要GRANT EXECUTE函数(args)到MapServerUser语句的这些信息!
提前谢谢!!!
答案 0 :(得分:1)
在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角色,但我的经验是PUBLIC自动获得使用SECURITY INVOKER定义的函数的执行权限。