如果使用“set local”,使 postgres 函数作为并行安全函数是否安全

时间:2021-07-16 04:47:05

标签: postgresql

我在我的应用程序中使用这样的查询作为查询的一部分,以便对用户进行身份验证

set local jwt.claims.sub to 'ffad81a1-cc4e-4370-b4bc-1453975a4e8d';

根据上述内容,在另一个标记为 parallel safe

的过程中访问该值是否安全

我正在执行一个事务,它首先进行 set local 调用,然后执行 select 查询。我想标记为并行安全的函数实际上用作我的行级安全逻辑的一部分,因此它在 select 查询期间执行,并且所有这些都在以set local 调用。

文档说明

<块引用>

... 如果它们访问临时表、客户端连接状态、游标、准备好的语句或系统无法在并行模式下同步的其他后端本地状态(例如,setseed 不能在由组长执行,因为另一个进程所做的更改不会反映在组长中)。

https://www.postgresql.org/docs/12/sql-createfunction.html

我想知道 set local 的这种用法是否被视为 client connection state?希望不会因为 parallel safe 对某些功能产生巨大影响,并且很乐意启用它

1 个答案:

答案 0 :(得分:1)

使用 SETSET LOCAL 的函数应该标记为 PARALLEL RESTRICTED,否则处理查询的工作进程不同意设置,这会导致麻烦。

您可以重构代码并在函数外运行 SET LOCAL之前运行使用该函数的 SQL 语句。只要它们在同一个事务中运行,就不会有区别。

或者,您可以使用

ALTER FUNCTION ... SET parameter = value;

这种情况下,修改后的参数值只在函数执行期间生效,不会泄露到函数外,所以使用PARALLEL SAFE应该是安全的。

相关问题