当前位置: 首页 > 知识库问答 >
问题:

如何使Postgres扩展对非超级用户可用

鲍永春
2023-03-14

我安装了一个Postgres扩展(uncent),带有

sudo su posgres
psql create extension unaccent

现在我可以在sql中使用unacccent,但前提是我是Postgres用户。

如何使所有/其他用户都可以使用Postgres扩展

(使用Postgres 9.3.5在Ubuntu上安装Im,使用apt安装)

jthinksearch=# \dx;
                         List of installed extensions
   Name   | Version |   Schema   |                 Description
----------+---------+------------+---------------------------------------------
 plpgsql  | 1.0     | pg_catalog | PL/pgSQL procedural language
 unaccent | 1.0     | public     | text search dictionary that removes accents
(2 rows)

jthinksearch=#


jthinksearch=> \du;
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 ubuntu    |                                                | {}

postgres@ip-172-31-39-147:/home/ubuntu/code/jthinksearch/报告/src/main/sql$退出ubuntu@ip-172-31-39-147:~/code/jthinksearch/报告/src/main/sql$psql jthinksearch psql(9.3.5)键入帮助。

我给了用户超级用户角色,但没有帮助,然后按照建议输入模式名称,这对错误消息有影响,但仍然不起作用

jthinksearch=# \du;
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
 ubuntu    | Superuser                                      | {}

jthinksearch=# select unaccent(name) from musicbrainz.artist where id=195660;
ERROR:  function unaccent(character varying) does not exist
LINE 1: select unaccent(name) from musicbrainz.artist where id=19566...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
jthinksearch=# ^C
jthinksearch=# select public.unaccent(name) from musicbrainz.artist where id=195660;
ERROR:  text search dictionary "unaccent" does not exist
jthinksearch=#

共有2个答案

周睿范
2023-03-14

这是我的解决方案。我有一个超级用户(postgres)和非超级用户(pg4e_user_8087f)和一个数据库(pg4e),我想安装hstoreuuid-ossp扩展并在不成为超级用户的情况下使用它们。我使用PostgreSQL 11。

超级用户窗口:

\c pg4e
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
ALTER EXTENSION "uuid-ossp" SET SCHEMA public;
CREATE EXTENSION IF NOT EXISTS "hstore";
ALTER EXTENSION "hstore" SET SCHEMA public;
GRANT ALL ON ALL FUNCTIONS IN SCHEMA public TO pg4e_user_8087f; 

完成上述命令后的非超级用户窗口:

pg4e=> \dx
                            List of installed extensions
   Name    | Version |   Schema   |                   Description                    
-----------+---------+------------+--------------------------------------------------
 hstore    | 1.5     | public     | data type for storing sets of (key, value) pairs
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 uuid-ossp | 1.1     | public     | generate universally unique identifiers (UUIDs)

pg4e=> select uuid_generate_v1();
           uuid_generate_v1           
--------------------------------------
 2114df5a-16bb-11ea-8000-468ce7a721ef
(1 row)

pg4e=> SELECT 'a=>1,b=>2'::hstore;
       hstore       
--------------------
 "a"=>"1", "b"=>"2"
(1 row)

在某一点上,我几乎已经解决了所有问题,但没有意识到超级用户必须连接到所讨论的数据库才能创建并允许扩展。一旦我发现这是为一个特定的数据库做的,它很快就就位了。

潘彦
2023-03-14

根据此错误消息:

错误:文本搜索词典“uncent”不存在

而前一个未找到不带模式前缀的uncent,这意味着uncent函数所在的public模式不在您的search\u路径中。

在这种情况下,uncent会失败,因为它是一个字典函数,基本上需要通过search\u路径查找内容。

这在PostgreSQL是否支持“重音不敏感”排序规则中有更详细的解释?

一旦将public模式添加到需要调用它的用户的search\u路径(这通常是默认设置)中,这应该会起作用,他们不需要是超级用户。

或者,如果此解决方案不可接受,您还可以使用嵌入模式并增加不变性的中间存根函数,如上面链接的答案中建议的那样。

 类似资料:
  • 在postgres中,如何将现有用户更改为超级用户?由于各种原因,我不想删除现有用户。

  • 问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在

  • 我正在尝试创建一个任何用户都可以调用的函数,以便将数据从/复制到文件。。。我的想法是设置一个充当超级用户的函数,或者一个作为“postgres”执行的函数,但我不知道从何开始。 谁能给我指出正确的方向?

  • 问题内容: 在Java中,我可以从通用超类型进行扩展吗?根据这篇文章,看来我应该能够:http : //www.ibm.com/developerworks/java/library/j-djc05133.html。 但是,当我在应用程序中执行类似操作时,出现以下错误: “无法将类型参数T引用为超类型。” 有谁知道我是否能够从Java中的泛型超型扩展?而且,如果是这样,是否需要特殊的东西来实现这一

  • 问题内容: 我必须安装到docker postgres上 这是我在Shell中执行我的普通命令的需求 如果我删除容器中的那行,它可以工作,但是我必须自己执行安装,并且我必须告诉项目中的每个人都这样做,这不是一个好习惯 这是我的 这是我的码头工人文件 构建后,我无法运行它 题: 如何从dockerfile 安装? 我想制作图像并将其重新用于团队的整个项目 问题答案: 之所以失败是因为Postgres

  • Dart 2.6引入了一个新的语言特性,叫做“静态扩展成员”。 但是,我不太明白如何使用它。 我希望轻松获取或的,即使用而不是: 我试图执行以下操作,但这是一个语法错误: