首先是简短版本:
SET ROLE
是否可以使用特定角色自动调用新的 PostgreSQL 数据库连接,无论是通过连接角色的配置(使用ALTER ROLE
),还是连接 URI 末尾的选项?
更长,有上下文:
我正在设置一个 Web 应用程序以使用轮换数据库凭据(因此,有多种角色在起作用)。但是,这些凭据也用于修改数据库(通过 Rails 迁移),这意味着表将由一个不会长期存在的角色拥有。
我可以修改轮换凭据,以便它们从父角色(它本身不能登录)继承,然后通过SET ROLE
所有数据库修改归父角色所有,而不是短期子角色。这解决了所有权问题,但它需要调用每个连接SET ROLE parent
——实际上并不可行。
因此,我需要一些方法来确保每个子连接始终在父角色的上下文中运行。这可能吗?
正如@phemmer在这里回答的那样,您可以使用
set
这样的命令:这样,
child_role
自动更改parent_role
为登录时。前提是
child_role
属于parent_role
。评论后编辑:
对象创建:
我们创建
my_schema
之前的设置:正如我们所见,所有者是
child_user
。现在我们修改用户设置。
我们创建
my_schema2
架构:my_schema2
parent_child
无需显式键入SET ROLE
命令即可自动拥有。注意: 文档指定它仅在登录时发生。
这不是 PostgreSQL 可以自己做的事情
你想在你的连接池中这样做
从池中获得连接后,立即调用
SET ROLE
释放与池的连接后,立即调用
RESET ROLE
不是 Ruby 的人,所以在这方面帮不了你太多,但这是你在 Java 中的做法: