也许我说了些傻话,但是是否可能从超级用户(如postgres)创建一个扩展,将其放在另一个带有自己模式和所有者的数据库中?
我有一个名为sdmed的数据库,其中包含两个模式public和sdmed。我还有一个名为sdmed的角色,该角色只能创建表。
我想在这些数据库中创建一个扩展,该扩展具有函数、表和类型。
如果不行,有更好的方法吗?
编辑:
我的原始问题不完整。我的意思是我想从用户postgres(或超级用户)在其他数据库中创建扩展,并具有它的所有者、角色和模式。此外,这些扩展将在这些数据库中使用。
我尝试这个:
首先,我为该模式创建一个函数(sdmed是一个数据库,具有名为sdmed的模式,它的所有者是sdmed)。
我有一个名为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
设为超级用户,但出于最佳实践的考虑,我希望避免这样做。
UPDATE pg_extension SET extrelocatable = TRUE WHERE extname = 'hola'; ALTER EXTENSION hola SET SCHEMA sdmed;
- Jim Jones