Postgres 功能中的行级别安全性。会话变量集等于函数参数的问题

Postgres Row Level Security in function. Problem with session variable set equals function's parameter

提问人:Иван Размахнин 提问时间:10/2/2023 更新时间:10/2/2023 访问量:25

问:

我已将行级别安全性添加到我的测试表中。如果我在函数中设置会话变量“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,
...............
........
...


我尝试了许多设置变量等于参数的方法,但没有任何东西可以按照我的意愿工作。

PostgreSQL 行级安全性

评论

0赞 Иван Размахнин 10/2/2023
@LaurenzAlbe , (set “my.user_id” = '1';) 工作正常,但 (set “my.user_id” = v_user_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
非常感谢您的帮助!它正在工作。