gpt4 book ai didi

postgresql - 从 PLPgSQL 函数内部执行 DDL 时干净地设置角色

转载 作者:行者123 更新时间:2023-11-29 13:17:09 25 4
gpt4 key购买 nike

先了解一下背景知识:我有一个部署到许多站点的应用程序,每个站点都有自己的数据库。

多个用户可以使用数据库。我创建了一个 appdbusers 角色,我授予每个用户。数据库和所有表都属于 appdbusers

在应用程序启动时,upgradedb() 函数执行所需的 DDL 以添加/修改/删除关系、元组、约束等,以满足应用程序的要求。

在调用 upgradedb() 之前,应用程序会执行 SET ROLE appdbusers 并在之后执行 RESET ROLE。这样,第一个启动新版本的用户会升级数据库。

现在我有一个相当大的 PLPgSQL 函数,我在其中删除了 2 个表并重新创建它们;这些应该被定义为 TEMP 表,但由于不同的原因它们不能。我可以将它们视为常规表并在 upgradedb() 中执行 DDL 魔术,但我更喜欢在每次运行时删除并重新创建它们。

我想在函数的开头包含 SET ROLE appdbusers 并在结尾包含 RESET ROLE 但如果函数因任何原因中止(包括用户中断),RESET ROLE 永远不会发生。

我还没有在 PLPgSQL 中看到 TRY...FINALLY 构造,我已经读到 ( here):

functions that need to trap exceptions are considerably more expensive, so it's best to avoid exceptions.

那么有没有办法在函数退出时自动重置角色呢?或者是否有更好的方法来处理 DDL 逻辑?

最佳答案

使用SET LOCAL ROLE

文档说:

The effects of SET LOCAL last only till the end of the current transaction, whether committed or not.

除非您在调用该函数之前启动显式事务,否则它应该会执行您想要的操作。

关于postgresql - 从 PLPgSQL 函数内部执行 DDL 时干净地设置角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com