PostgreSql SET configuration_parameter 来自存储过程

PostgreSql SET configuration_parameter from Stored Procedure

我正在 postgres table 上实施行级安全性 (RLS)。要使用单个用户,我为映射到行标识的每个会话设置了一个 configuaration_parameter 并且它有效。我可以使用 SQL 对此进行测试,但由于我在应用程序中使用 Mulesoft,因此我无法控制设置连接和设置参数。我试图创建一个存储过程,我尝试在开始时设置值,但 postgres 不喜欢它。文档不分享我是否可以在 SP 中实现它,所以想知道你们是否确定,所以我可以看看替代解决方案。

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

如果我取消对行 SET doc.provider=$1;

的注释,下面的内容将不起作用
CREATE OR REPLACE PROCEDURE getParticipants(text)
LANGUAGE plpgsql
AS $$
    BEGIN
    --SET doc.provider=;

    SELECT * FROM disclosure.participantsxref;

    END;
$$;

声明 SET 不允许 parametrization.Instead 你可以使用函数 set_config:

CREATE OR REPLACE FUNCTION foo(text)
RETURNS SETOF disclosure.participantsxref AS $$
BEGIN
  PERFORM set_config('doc.provider', , true);
  RETURN QUERY SELECT * FROM disclosure.participantsxref;
END $$
LANGUAGE plpgsql;

在你的例子中,还有另一个问题 - PostgreSQL 的过程不能 returns tables - 如果你想 return table,那么你必须使用功能。函数可以 return tables with statement RETURN QUERY.

你可以尝试使用动态 SQL :

create or replace procedure myproc ()
as $$
begin 
    execute format('set lc_numeric=%L', 'fr_FR') ;
end;
$$ 
language 'plpgsql';
CREATE PROCEDURE

show lc_numeric;
 lc_numeric  
-------------
 en_US.UTF-8
(1 row)

call myproc();
CALL

show lc_numeric;
 lc_numeric 
------------
 fr_FR
(1 row)