【问题标题】:Grant EXECUTE to many PostGIS functions将 EXECUTE 授予许多 PostGIS 功能
【发布时间】:2010-10-07 14:16:14
【问题描述】:

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

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

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

提前谢谢你!!!

【问题讨论】:

    标签: postgresql postgis sql-grant


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

    【讨论】:

    • 我差点忘了:那个查询只显示用户定义的函数。如果您需要内部函数,则需要删除 WHERE 子句的 "AND n.nspname 'pg_catalog'" 部分。
    • 谢谢,这似乎接近我想要的。由于我使用的是 PostgreSQL 8.2.9,我没有函数 pg_get_fction_result(oid) 和 pg_get_function_arguments(oid),所以也许你知道等效的 8.2。功能?我找了他们,但找不到他们。此外,proiswindow 列也不存在。
    • 在命令行运行它:“psql -E”。然后发出 psql 命令“\df”。它将打印用于输出函数列表的查询(带有参数和返回类型)。这应该适用于所有版本的 PostgreSQL。
    猜你喜欢
    • 2019-01-24
    • 2015-12-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2017-07-17
    • 2022-01-12
    • 2019-05-21
    相关资源
    最近更新 更多