授予许多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定义的函数的执行权限。
我差点忘了:那个查询只显示用户定义的函数。如果您需要内部函数,则需要删除WHERE子句的“AND n.nspname 'pg_catalog'”部分。 – 2010-10-07 14:36:05
谢谢,这似乎接近我想要的。因为我使用的是PostgreSQL 8.2.9,所以我没有函数pg_get_fuction_result(oid)和pg_get_function_arguments(oid),所以也许你知道等价的8.2。功能?我找了他们,但找不到他们。此外,列proiswindow不存在。 – 2010-10-07 14:51:30
在命令行运行此命令:“psql -E”。然后发出psql命令“\ df”。这将打印使用它来输出的功能列表(参数和返回类型)查询。这应该适用于PostgreSQL的所有版本。 – 2010-10-07 17:34:36