提问人:Иван Размахнин 提问时间:10/2/2023 更新时间:10/2/2023 访问量:25
Postgres 功能中的行级别安全性。会话变量集等于函数参数的问题
Postgres Row Level Security in function. Problem with session variable set equals function's parameter
问:
我已将行级别安全性添加到我的测试表中。如果我在函数中设置会话变量“my.user_id”=“1”,RLS 工作正常。不知不觉中,如果我将会话变量设置为等于函数的某些参数,RLS 策略不会看到它。有人能说出来,是否可以为 RLS 等于函数的参数设置变量?
CREATE OR REPLACE FUNCTION sbx.get_expenses_by_ppp_table_2(v_user_id character varying,day character varying)
RETURNS TABLE(report_id integer, report_row_id character varying, report_row_name character varying, row_level_num integer, fact_amount numeric, plan_amount numeric, execution_percentage numeric, daily_fact_amount numeric)
LANGUAGE plpgsql
AS $function$
#variable_conflict use_column
declare
report_day date;
report_year int4;
begin
report_day := day::date;
report_year := date_part('year', report_day);
set "my.user_id" = v_user_id;
return query select 1 as report_id,
ex.ppp_code as report_row_id,
...............
........
...
我尝试了许多设置变量等于参数的方法,但没有任何东西可以按照我的意愿工作。
答:
0赞
Laurenz Albe
10/2/2023
#1
如果你
SET my.user_id = v_user_id;
将 placeholder 参数设置为文本值。'v_user_id'
您可以通过调用函数来实现所需的目标:set_config()
PERFORM set_config('my.user_id', v_user_id, FALSE);
评论
0赞
Иван Размахнин
10/2/2023
非常感谢您的帮助!它正在工作。
评论