以非超级特权用户身份创建 UUID 扩展

Ale*_*lex 7 postgresql postgresql-extensions

我需要在我的数据库上加载 uuid 扩展,这是在运行时创建的。创建数据库的用户不是超级用户,她只有“CREATEDB”权限。

有没有办法做到这一点?谢谢。

Erw*_*ter 7

我看到两种可能性:

1.

将扩展安装到模板数据库(只是一个常规数据库)并将其用作以下模板CREATE DATABASE

CREATE DATABASE new_db TEMPLATE my_template_db;
Run Code Online (Sandbox Code Playgroud)

这会将所有已安装的扩展复制到新数据库中。您的用户显然可以做到这一点

此外,如果她创建了数据库,那么CREATE EXTENSION无论如何她都应该拥有运行所需的权限。我引用手册

对于大多数扩展,这意味着需要超级用户或数据库所有者权限。

2.

创建一个SECURITY DEFINER执行所有必要 DML 语句的函数,由超级用户拥有。撤销所有权限public并授予EXECUTE用户角色:

CREATE FUNCTION foo() ... SECURITY DEFINER;
REVOKE ALL ON FUNCTION foo() FROM public;
GRANT EXECUTE ON FUNCTION foo() to my_user;
Run Code Online (Sandbox Code Playgroud)

阅读手册中的“安全地编写 SECURITY DEFINER 函数”一章。