我是否需要每次都执行“创建扩展 pgcrypto”?

Arj*_*ECH 4 postgresql pgcrypto read-only-database postgresql-extensions

crypt()在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()/crypt()未知或未定义。我执行了create extension pgcrypto;一次,它开始工作。

如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?

或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?

或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?

此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?

Erw*_*ter 6

pgcrypto是一个普通的 Postgres 扩展。您必须为每个数据库(而不是您可能一直假设的每个数据库集群)安装一次它才能使用它。安装是永久性的,幸存的数据库会重新启动。

如果您希望同一数据库集群中的每个数据库都预先安装,则可以template1通过连接到默认模板数据库并正常安装来将其安装到默认模板数据库中。或者将其安装在任何其他数据库中并将用作模板:

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

看:

另一件事可能会出错:search_path. 看:

但是,如果这是您的问题,您会在第二次尝试安装相同的扩展时收到警告。

我能想到的唯一其他奇特的解释是:您的数据库可能已恢复到以前的状态。但你肯定知道这一点,不是吗?

或者您只是错误地连接到了不同的数据库?你提到的“只读副本”?

如何在这种只读环境中使用此加密功能?

如果您的复制解决方案没有复制它,您必须手动安装一次。