PostgreSQL启用扩展而无需超级用户


13

我有一台PostgreSQL 9.5服务器,在该服务器上有一些脚本可以自动为用户创建角色和数据库。在这些数据库中,启用特定的扩展(例如pgcrypto)将很有帮助,但是据我所知,它必须是超级用户才能运行CREATE EXTENSION。有没有一种方法可以启用此类扩展,而无需使用超级用户帐户手动登录?


4
您是否尝试过将它们添加到template1,然后通过template1like 创建每个用户数据库CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1
卡森德里(Kassandry),2013年

1
@Kassandry没想到,但是是个好主意。理想情况下,我希望所有者可以根据需要添加扩展名,但这仍然是可以接受的。
beldaz

Answers:


10

从扩展文档中,

superuser(布尔值)如果此参数为true(默认值),则只有超级用户才能创建扩展名或将其更新为新版本。如果将其设置为false,则仅需要执行安装或更新脚本中的命令所需的特权。

该值未在中设置pgcrypto.control,因此默认情况下为true,这需要一个SuperUser。

这意味着CREATE EXTENSION尽管CREATE EXTENSION上的文档使您相信,但您不能仅作为数据库的所有者。

我尝试将其设置为false,没有任何乐趣。C是不可信的语言,您将获得

错误:语言C的权限被拒绝

来自pg_language上的文档

只有超级用户才能使用不受信任的语言创建功能。

...当然,您可以以超级用户身份获得c信任UPDATE pg_language set lanpltrusted = true where lanname = 'c';。然后CREATE EXTENSION pgcrypto可以作为非超级用户正常工作。但是,如果您不得不担心用户将源上传到扩展目录,然后将其安装在数据库中,那听起来是个坏主意。也就是说,我不会走那么远。我会找到另一种方法给这只猫换皮。


谢谢Evan,这是我所要求的彻底答案。我可能会选择@Kassandry的猫皮提案来解决此问题。我也曾考虑过将CREATE EXTENSION包装在存储过程中,但是在没有dblink身份验证麻烦的情况下,找不到在同一数据库中进行此工作的途径。
beldaz

那么,没有什么选择pg_dump可以防止它转储有关扩展的语句又有什么意义呢?目前,我必须使用外部文本处理工具从中转储的SQL中删除这些语句pg_dump
Claudix '18年

@Evan Carroll:是否可以通过psql cli将超级用户设置为false?我在亚马逊aws rds上有一个实例,但没有访问pgcrypto.control的权限。
ribamar

2
@ribamar否,因为那将意味着连接到数据库的任何人都可以作为db postmaster执行字面的任意代码执行。那将是一个可怕的想法。
埃文·卡罗尔

没有人,超级用户。我知道您可以通过这种方式将操作系统超级用户与dbms超级用户区分开来,尽管如果我做出这样的决定,我将为该工具提供支持,并且如果确实需要创建另一个功能更强大的用户,则可以实现它。在工具内。
ribamar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.