无法使用行级安全性更新表行

2023-12-02

我正在尝试使用行级安全策略更新表中的行,但不断收到错误new row violates row-level security policy for table "my_table".

以下是我设置 RLS 策略的方法:

alter table my_table enable row level security;
alter table my_table force row level security;

create policy select_policy on my_table for select to public using (deleted is false);
create policy insert_policy on my_table for insert to public with check (true);
create policy delete_policy on my_table for delete to public using (true);
create policy update_policy on my_table for update to public using (true) with check (true);

我尝试运行的查询是:

update my_table set deleted = true where id = 1;

我需要对其中的行执行“软删除”my_table以这种方式 - 通过切换deleted flag.


我在这里做错了什么?我如何使此类查询有效?


更新#1

重现步骤:

create table if not exists my_table (
    "name" varchar(40),
    deleted boolean default false
);

insert into my_table (name) values ('John'), ('Alice'), ('Bob');

alter table my_table enable row level security;
alter table my_table force row level security;

drop policy if exists my_table_select_policy on my_table;
drop policy if exists my_table_insert_policy on my_table;
drop policy if exists my_table_delete_policy on my_table;
drop policy if exists my_table_update_policy on my_table;

create policy my_table_select_policy on my_table for select to public using (deleted is false);
create policy my_table_insert_policy on my_table for insert to public with check (true);
create policy my_table_delete_policy on my_table for delete to public using (true);
create policy my_table_update_policy on my_table for update to public using (true);

update my_table set deleted = true where name = 'John'; -- throws error

On the screenshot below are the privileges of current_user: enter image description here

我当前用户的授权是grant all on schema public to my_user;


Postgres 应用了我的表选择策略 on the 更新行(已删除=假)。出于我不知道的原因。

作为一种解决方法,我建议建立一个宽限期,其中我的表选择策略仍然返回 true:

  • 代替delete have a 删除时间列并在删除时将当前时间戳存储在其中(即删除发生时的时间戳)
  • 在 SELECT 策略中检查是否删除时间为NULL或deleted_at与now之间的时间小于1秒
  USING (
        my_table.deleted_at IS NULL
        OR
        ABS(EXTRACT(EPOCH FROM (now() - my_table.deleted_at))) < 1
  )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用行级安全性更新表行 的相关文章

随机推荐

  • Angular 2-ngModel 中的更改未反映在下拉列表中

    所以我有一个非常简单的场景 其中在下拉列表更改时显示确认弹出窗口 如果用户选择取消 我需要将下拉值恢复为旧值 我认为我做得正确 甚至在 DOM 中 ngModel 的值与select正在反映 但不知何故 它并没有恢复显示中的选定值 这是我的
  • 以编程方式获取框架 ID

    有人知道是否有办法以编程方式获取当前框架 ID 是的 您可以在 Play 类上获取该属性 Play id
  • 离散小波变换 Matlab

    我正在尝试使用 Matlab 小波工具箱中提供的函数来创建图像的多级离散小波分解 提取系数 操作它们 并将它们重新组合回图像中 我尝试使用许多函数 但它们似乎都不能满足我的需要 以下是执行此操作的步骤 使用wavedec2将图像分解为 C
  • 在 C# 中,这段带有“get”的代码是什么意思?

    我是 C 新手 private string m public string M get return m C 中的这种 getter setter 是否像 Java 一样 这部分是一个字段 private string m 这部分是一个只
  • 将数组/对象树的键转换为小写

    我目前正在优化一个 PHP 应用程序 发现一个函数被调用了大约 10 20k 次 所以我想我应该从那里开始优化 function keysToLower obj if is object obj is array obj return ob
  • 从列表中随机选择

    我在 Excel 工作表 A1 B115 中有一个项目列表 目前我可以输入 10 个变量 从列表中检索正确的数据 现在代码 C1 1 运行A1 A115并检查值是否在1000 2000之间 如果是这样 请将 B 值复制到某处 C2 1 运行
  • 如何在 WooCommerce 中对自定义购物车费用进行征税

    准确地找到了我正在寻找的代码片段 无论价格如何 都可以为每个单独的购物车项目添加固定费用金额 这个网站是卖轮胎的 所以每个轮胎都会充电3 这是我正在使用且有效的代码 add action woocommerce cart calculate
  • 无法维护java多线程中生产者任务的顺序

    我正在编写一个多线程应用程序 其中有 n 个生产者尝试将元素添加到共享资源 我想维护生产者在共享资源中生成元素的顺序 例如 我的共享资源是 SynchronizedQueue P1 P2 P3 P4 将按照 p1 p2 p3 p4 的顺序生
  • 修复“xml 外部实体引用不正确的限制”的最佳方法是什么?

    我们最近运行 VeraCode 指出了以下方法 public XmlElement RunProcedureXmlElement string Procedure List
  • 使用线程池/线程来读取大型文本文件?

    关于我之前的一个问题 我发布了 我必须读取几个非常大的 txt 文件 并且必须根据用户输入使用多个线程或单个线程来执行此操作 假设我有一个获取用户输入的 main 方法 并且用户请求一个线程并希望为该线程处理 20 个 txt 文件 我将如
  • GAE Webapp2 - 销毁会话不起作用

    或者我误解了如何破坏工作 这是一个示例代码 class TestHandler BaseHandler def get self counter self session get counter if not counter counter
  • 如何使用 Observable.FromEvent 而不是 FromEventPattern 并避免字符串文字事件名称

    我正在学习 WinForms 中的 Rx 方法 并有以下代码 Create an observable from key presses grouped by the key pressed var groupedKeyPresses Ob
  • 为什么 Python 在 print() 输出之前将异常打印到控制台

    我正在编写一个相当冗长的函数 它读取 CSV 文件并循环遍历行并检查它们是否具有预期的格式 如果发现不符合预期的格式 则会引发异常 对于具有预期格式的每一行 它都会向控制台打印一条消息 使用 print 函数 说明该行有效 否则会引发错误
  • 如何获取选项卡之前的 URL?

    在编写 Chrome 扩展程序时 给定一个选项卡 如何获取该选项卡中之前访问过的页面的 URL 即我点击 后退 后将出现在多功能栏中的网址 由于我找不到任何API方法 我只是应用了上面vux777的建议 每次加载页面时 我都会存储从 id
  • 如何仅重新加载用户脚本,即不重新加载页面?

    我正在为一个网络应用程序编写一个 Greasemonkey 用户脚本需要配置步骤在我可以实际测试我的用户脚本的功能之前 因此 每次我重新加载页面 从更新的文件刷新我的用户脚本 时 我都必须在测试之前重新配置 Web 应用程序 不用说 这很快
  • ios5中的应用程序图标徽章编号

    我只是想知道 applicationIconBadgeNumber 是否已在 iso 5 中更改 因为当我在 sim 中运行我的应用程序时 数字工作正常 但如果在我的 iPhone 上运行它 它不会显示它 我没有更改在 iOS 4 3 中运
  • 尝试使用 Selenium Python 时出现 NoSuchElementException

    当尝试使用 Selenium 在 python 中查找元素时 我不断收到 NoSuchElementException 异常 我正在等待页面完全加载 然后切换到正确的框架 或者至少我这么认为 这是代码 driver get https ww
  • Selenium 自动下载文件 C#

    我正在尝试设置 Firefox 以自动下载文件 我按照建议做了在此输入链接描述 但我无法让它发挥作用 这是我的代码 FirefoxOptions options new FirefoxOptions options SetPreferenc
  • 如何统一从多组单选按钮和多组复选框获取的文本?

    我的 JavaScript 代码是这样的 function input type radio click function var radio this var name this prop name if this was previou
  • 无法使用行级安全性更新表行

    我正在尝试使用行级安全策略更新表中的行 但不断收到错误new row violates row level security policy for table my table 以下是我设置 RLS 策略的方法 alter table my