Postgresql行级安全性在INSERT的策略中检查WITH CHECK中的新数据

时间:2017-11-16 13:36:29

标签: postgresql row-level-security

我有一个包含多个表格的数据库。 用户有几个对象,一个对象有几个部分。

我想编写一个策略,只允许对象的创建者向对象添加部分。因此我需要获取要插入的部件所属的对象,但我不知道如何检查数据。

有没有办法让数据插入政策?

感谢您的努力。

1 个答案:

答案 0 :(得分:0)

以下是如何使用行级安全性实现类似的示例。根据您的需要进行调整!

CREATE TABLE object(
   id integer PRIMARY KEY,
   name text NOT NULL,
   owner name NOT NULL DEFAULT current_user
);

CREATE TABLE part(
   id integer PRIMARY KEY,
   parent_id integer NOT NULL REFERENCES object(id),
   name text NOT NULL
);

我们必须给予一些权限:

GRANT SELECT, INSERT ON object TO PUBLIC;
GRANT SELECT, INSERT ON part TO PUBLIC;

现在,当INSERT中的part匹配时,我们会启用行级安全性并仅在owner中允许object

ALTER TABLE part ENABLE ROW LEVEL SECURITY;

CREATE POLICY insert_only_owned ON part
   FOR INSERT TO PUBLIC
   WITH CHECK (EXISTS(
                  SELECT 1
                  FROM object o
                  WHERE o.id = parent_id
                    AND owner = current_user
              ));