【问题标题】:ERROR: permission denied for function geography_eq错误:功能 geography_eq 的权限被拒绝
【发布时间】:2021-02-03 22:05:15
【问题描述】:

最近,我将 PostgreSQL 11 数据库的 Docker 容器从postgres 换成了postgis/postgis:11-2.5-alpine,将geolocation public.geography(Point,4326) 列添加到public.user 表中,仅此而已。

到目前为止,没有使用 PostGIS 中的任何内容。

在我的应用程序的某些时候,我收到以下错误:

ERROR:  permission denied for function geography_eq
CONTEXT:  SQL function "user_private_message_peers" statement 1
STATEMENT:  select to_json((__local_0__."id")) as "id", to_json((with __local_1__ as (select to_json((json_build_object('id'::text, (__local_2__."id"), 'nickname'::text, (__local_2__."nickname")))) as "@nodes"
db_1    |   from "public"."user_private_message_peers"(__local_0__) as __local_2__
db_1    |   
db_1    |   where (TRUE) and (TRUE)
db_1    |   
db_1    |   
db_1    |   ), __local_3__ as (select json_agg(to_json(__local_1__)) as data from __local_1__) select json_build_object('data'::text, coalesce((select __local_3__.data from __local_3__), '[]'::json)) )) as "@privateMessagePeers"
db_1    |   from "public"."current_user"() as __local_0__
db_1    |   
db_1    |   where (not (__local_0__ is null)) and (TRUE) and (TRUE)

一个函数user_private_message_peers在迁移到PostGIS后没有改变:

CREATE FUNCTION public.user_private_message_peers("user" public."user") RETURNS SETOF public."user"
    LANGUAGE sql STABLE STRICT
    AS $$
        SELECT
          distinct u.*
        FROM
          "user" AS u
        INNER JOIN
          "privateMessage" pm ON (
            pm."recipientId" = u.id OR pm."senderId" = u.id
          )
        WHERE (
          u.id != "user".id
        ) AND ((
          pm."senderId" = 1 AND pm."recipientId" != 1
        ) OR (
          pm."senderId" != 1 AND pm."recipientId" = 1
        ));
      $$

public.user.geolocation 列上没有索引。

SELECT
    tablename,
    indexname,
    indexdef
FROM
    pg_indexes
WHERE
    schemaname = 'public' AND tablename = 'user'
ORDER BY
    tablename,
    indexname;
tablename indexname indexdef
user user_nickname_key CREATE UNIQUE INDEX user_nickname_key ON public."user" USING btree (nickname)
user user_pkey CREATE UNIQUE INDEX user_pkey ON public."user" USING btree (id)

geography_eq 函数是否在某处隐含使用?

更新:

默认权限为:

\ddp
Default access privileges
-[ RECORD 1 ]-----+--------------------
Owner             | postgres
Schema            | 
Type              | function
Access privileges | postgres=X/postgres

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    该错误意味着为 geography 类型实现相等运算符的函数已损坏权限。不知何故,您的 PostGIS 安装搞砸了。

    最好的解决方法是删除并重新创建 postgis 扩展。

    如果您定义了任何默认权限,请与 psql 检查:\ddp

    【讨论】:

    • 数据库模式转储显示来自 PostGIS 的所有实体的一系列 REVOKE ALL ON FUNCTION public.geography_eq(public.geography, public.geography) FROM PUBLIC; 语句。是否偏离了默认值?
    • 是的,这是一个偏差。
    • 好的,会解决的。但是我还是不明白,为什么这种违规发生在一个没有使用PostGIS功能的地方?顺便说一句,我的数据库中根本没有使用它们……
    • 事后很难弄清楚是什么导致了问题。如果你保留了你的 PostgreSQL 日志文件,并且你有 log_statement = 'ddl',你可以在那里挖掘。
    • 我注意到,PostgreSQL 数据库撤销了所有正在创建的扩展实体的所有权限。这是默认行为吗?在官方文档中没有找到它。
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 2022-07-12
    • 2023-03-22
    • 2016-09-25
    • 2015-09-16
    • 2012-02-11
    • 2016-11-14
    • 2016-12-28
    相关资源
    最近更新 更多