postgresql Postgres函数中的行级安全性,会话变量设置等于函数参数的问题

hwamh0ep  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(113)

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

我试过很多方法设置变量等于参数,没有一个是我想要的。

rbl8hiat

rbl8hiat1#

如果你

SET my.user_id = v_user_id;

将占位符参数设置为文字值'v_user_id'
你可以通过调用set_config()函数来实现你想要的:

PERFORM set_config('my.user_id', v_user_id, FALSE);

相关问题