我在我的应用程序中使用这样的查询作为查询的一部分,以便对用户进行身份验证
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
对某些功能产生巨大影响,并且很乐意启用它
答案 0 :(得分:1)
使用 SET
或 SET LOCAL
的函数应该标记为 PARALLEL RESTRICTED
,否则处理查询的工作进程不同意设置,这会导致麻烦。
您可以重构代码并在函数外运行 SET LOCAL
,之前运行使用该函数的 SQL 语句。只要它们在同一个事务中运行,就不会有区别。
或者,您可以使用
ALTER FUNCTION ... SET parameter = value;
这种情况下,修改后的参数值只在函数执行期间生效,不会泄露到函数外,所以使用PARALLEL SAFE
应该是安全的。