首页 > 解决方案 > 如果使用`set local`,将postgres函数标记为并行安全是否安全

问题描述

我在我的应用程序中使用这样的东西作为查询的一部分来验证用户

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对某些功能产生显着影响,并希望启用它

标签: postgresql

解决方案


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

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

或者,您可以使用

ALTER FUNCTION ... SET parameter = value;

在这种情况下,更改后的参数值仅在函数执行期间有效,不会泄漏到函数之外,因此应该可以安全使用PARALLEL SAFE.


推荐阅读