存储过程的Postgresql SET configuration_parameter

时间:2020-06-15 20:10:51

标签: postgresql stored-procedures configuration

我正在postgres表上实现行级安全性(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=$1;

    SELECT * FROM disclosure.participantsxref;

    END;
$$;

2 个答案:

答案 0 :(得分:2)

声明SET不允许参数化。相反,您可以使用函数set_config

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

在您的示例中,还有另一个问题-PostgreSQL的过程无法返回表-如果要返回表,则必须使用函数。函数可以返回带有语句RETURN QUERY的表。

答案 1 :(得分:1)

您可以尝试使用动态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)
相关问题