postgresql 我们可以在Postgres中从RLS策略插入或更新表中的数据吗?

rdrgkggo  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(114)

我已经创建了包含client id (e.g 1,2,3)DB User name (u1,u2,u3)的表"clientID_dbUser_mapping"
现在创建另一个表"test_data",其中包含id(PK), data(text), client_id(FK)
已为"test_data"创建RLS策略,以访问相应的已登录db_user数据
以下是政策:

CREATE POLICY client_id_testdata_policy ON test_data
FOR ALL
USING (client_id =
              (SELECT client_id
               FROM client_dbuser_mapping
               WHERE db_user_name = current_user)
      )
WITH CHECK (client_id =
              (SELECT client_id
               FROM client_dbuser_mapping
               WHERE db_user_name = current_user)
           );

这对于SELECT/UPDATE/DELETE工作正常
对于INSERT,我想从"clientID_dbUser_mapping"表中添加client_id的默认数据,因为它包含根据db_user_name的客户端ID
那么,我如何通过RLS策略来实现这一点(我是否需要更改现有策略中某些内容)或需要创建新策略?
可能吗?

g0czyy6m

g0czyy6m1#

我不确定我是否正确理解了这个要求,但是如果你想在INSERT上强制client_id为某个值,请使用触发器:

CREATE FUNCTION set_client_id() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   SELECT cdm.client_id INTO NEW.client_id
   FROM client_dbuser_mapping AS cdm
   WHERE cdm.db_user_name = current_user;

   RETURN NEW;
END;$$;

CREATE TRIGGER set_client_id BEFORE INSERT ON test_data
   FOR EACH ROW EXECUTE PROCEDURE set_client_id();

相关问题