如何在PostgreSQL超级用户和另一个具有自己所有者的数据库之间创建扩展?

3
也许我说了些傻话,但是是否可能从超级用户(如postgres)创建一个扩展,将其放在另一个带有自己模式和所有者的数据库中?
我有一个名为sdmed的数据库,其中包含两个模式public和sdmed。我还有一个名为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;

此外(在准备自己的扩展之后),

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设为超级用户,但出于最佳实践的考虑,我希望避免这样做。

1个回答

1

我不太确定我是否理解了您的问题,但是如果您想知道它是否会影响扩展程序的正常工作,答案是:它不应该是一个问题 :)

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


你好。感谢您的回答。但是从Postgres中我无法做到这一点。我已经编辑了问题,因为第一个不完整。无论如何....怎么做呢? - user3733164
2
我明白了。你尝试过设置函数的模式吗?类似这样 UPDATE pg_extension SET extrelocatable = TRUE WHERE extname = 'hola'; ALTER EXTENSION hola SET SCHEMA sdmed; - Jim Jones
谢谢。这是我的概念错误。我想要创建一个角色sdmed并连接到sdmed数据库的扩展。或者像postgres使用sdmed一样,连接到postgres数据库。这很容易。对于这样一个愚蠢的问题,我很抱歉,但是你的回答“这不应该是个问题”是我深入探究的线索 :-) - user3733164

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接