postgresql - 如果使用`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
对某些功能产生显着影响,并希望启用它
解决方案
使用SET
或SET LOCAL
应该标记的函数PARALLEL RESTRICTED
,否则处理查询的工作进程不同意设置,这可能会导致麻烦。
在运行使用函数的 SQL 语句之前,您可以重构代码并SET LOCAL
在函数外部运行。只要它们在同一个事务中运行,它就不应该有所作为。
或者,您可以使用
ALTER FUNCTION ... SET parameter = value;
在这种情况下,更改后的参数值仅在函数执行期间有效,不会泄漏到函数之外,因此应该可以安全使用PARALLEL SAFE
.
推荐阅读
- python - 正则表达式捕获正则表达式匹配上方的 2 行
- android - 需要旧版本的 gradle 错误
- java - 改为配置 Spring 事务或 EJB CMT
- angular - store.select subscribe 中的更改检测需要 markForCheck。为什么?
- python - 没有名为 QtOpenGL 的模块
- javascript - Angular 2+ 在元素之间切换,基于点击
- c# - 使用 C# 将图片保存到数据库 MySQL 中的特定行中
- python - Python 2.7 Scapy:有人可以解释为什么只有服务器端套接字显示为 ESTABLISHED 而客户端连接未显示为 ESTABLISHED
- database - Neo4j - 在外部硬盘驱动器上有数据文件夹时出错
- angular - Ant Design Angular - 上传 - nzCustomRequest 不随请求发送图像数据