我正在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;
$$;
答案 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)