【问题标题】:Create extension from postgres superuser to another database with it own owner?创建从 postgres 超级用户到另一个拥有自己所有者的数据库的扩展?
【发布时间】:2020-05-11 11:07:24
【问题描述】:

也许我在说傻话,但是否可以在其他数据库中使用超级用户(如 postgres)创建扩展,并拥有自己的架构和所有者?

我有一个名为 sdmed 的数据库,有两个模式,publicsdmed。我还有一个名为 sdmed 的角色。此角色只能创建表。

我想在这些数据库中创建一个扩展。该扩展具有函数、表和类型。

如果不是,那么更好的方法是什么?

编辑:

我最初的问题不完整。我的意思是我想从其他数据库中的用户 postgres (或超级用户)创建扩展,其中包含所有者、角色和模式。此外,这些扩展名将用于那些数据库。

我试试这个:

首先,我只为那些模式创建一个函数(sdmed 是一个数据库,具有一个名为 sdmed 的模式,它的所有者是 sdmed):

CREATE OR REPLACE FUNCTION sdmed.di_hola() 
RETURNS void AS 
$BODY$
BEGIN
RAISE NOTICE 'Hola';
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION sdmed.di_hola()
  OWNER TO sdmed;

还有(在prepare my own extension之后)

postgres=# create extension hola;
ERROR:  schema "sdmed" does not exist

(数据库角色和架构sdmed存在)

如果我从 sdmed 数据库尝试:

sdmed=> create extension hola;
ERROR:  permission denied to create extension "hola"
HINT:  Must be superuser to create this extension.

我会让sdmed 成为超级用户,但为了保持最佳做法,我想避免这样做。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    我不确定你的问题是否正确,但如果你想知道它是否会以某种方式使扩展程序无法正常工作,答案是:这应该不是问题 :)

    由于用户sdmed 是数据库sdmed 的所有者,因此它可以访问此数据库中的所有对象——无论是谁创建的!因此,由用户 postgres 创建的函数安装的对象应该可以与用户 sdmed 一起使用,没有任何问题。

    【讨论】:

    • 你好。谢谢您的回答。但是从postgres我不能这样做。我已经编辑了这个问题,因为第一个问题不完整。无论如何....怎么能这样做?
    • 我明白了。您是否尝试过设置函数的架构?类似UPDATE pg_extension SET extrelocatable = TRUE WHERE extname = 'hola'; ALTER EXTENSION hola SET SCHEMA sdmed;
    • 谢谢。这是我的一个概念错误。我想创建扩展作为角色 sdmed 并连接到 sdmed 数据库。或者被 postgres 连接到 postgres 数据库。就像使用 sdmed 成为 postgres 一样简单。对于这么愚蠢的问题,我很抱歉,但你的回答说“这不应该是一个问题”是这样挖掘的线索:-)
    • @user3733164 很高兴它对您有所帮助 :) 我现在正在准备一个 postgresql 研讨会,我刚刚意识到乍一看它有多复杂。干杯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2013-05-07
    • 1970-01-01
    • 2011-10-05
    • 2018-04-05
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多