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)
我正在 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)