授予许多PostGIS函数的执行

问题描述:

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

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

我怎样才能提取所有功能的信息 - 的论点,即函数的名称,数量和名称 - 从INFORMATION_SCHEMA或数据库的pg_catalog?我需要GRAN EXECUTE对MapServerUser语句的函数(args)的信息!

谢谢!

在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参数(显示隐藏的查询),然后运行\ df命令运行PSQL实测值。

另外,PostgreSQL中的“公共”模式就是这样命名的。它没有特别的意义。这是一个糟糕的名字。你需要注意的是“公共”角色(全部大写)。虽然表格不会自动授予PUBLIC角色,但我的经验是,PUBLIC自动获得对使用SECURITY INVOKER定义的函数的执行权限。

+0

我差点忘了:那个查询只显示用户定义的函数。如果您需要内部函数,则需要删除WHERE子句的“AND n.nspname 'pg_catalog'”部分。 – 2010-10-07 14:36:05

+0

谢谢,这似乎接近我想要的。因为我使用的是PostgreSQL 8.2.9,所以我没有函数pg_get_fuction_result(oid)和pg_get_function_arguments(oid),所以也许你知道等价的8.2。功能?我找了他们,但找不到他们。此外,列proiswindow不存在。 – 2010-10-07 14:51:30

+0

在命令行运行此命令:“psql -E”。然后发出psql命令“\ df”。这将打印使用它来输出的功能列表(参数和返回类型)查询。这应该适用于PostgreSQL的所有版本。 – 2010-10-07 17:34:36