讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在PostgreSQL 16中通过行级安全策略限制特定用户的DELETE权限?

浅辰小哥_2257

浅辰小哥_2257

发布时间:2026-07-12 18:16:05

|

581人浏览过

|

来源于php中文网

原创

CREATE POLICY 时必须显式指定 FOR DELETE,PostgreSQL 不会为未声明的操作自动应用策略;即使已定义 SELECT 或 UPDATE 策略,DELETE 仍默认允许(仅受表级权限约束),需单独创建 FOR DELETE 策略并用 USING 表达式限定可删行,不支持 WITH CHECK,且强制行级安全(FORCE ROW LEVEL SECURITY)才使所有者受限制。

如何在postgresql 16中通过行级安全策略限制特定用户的delete权限?

CREATE POLICY 时必须显式指定 FOR DELETE

PostgreSQL 不会自动为未声明的操作类型应用策略。即使你已经为 SELECT 或 UPDATE 创建了策略,DELETE 仍默认允许(只要用户有表级 DELETE 权限)。要限制 DELETE,必须单独创建一条 FOR DELETE 策略。

常见错误现象:用户能正常 SELECT 自己的数据,也能成功执行 DELETE FROM table WHERE id = 123,但实际删掉了别人的数据——因为根本没定义 DELETE 策略。

实操建议:

  • 策略必须用 FOR DELETE 明确声明,不能省略或混在 FOR ALL 里依赖隐式覆盖
  • USING 表达式决定“哪些行允许被删除”,它只检查现有行是否匹配条件,不验证新值(DELETE 没有新值)
  • 例如限制用户只能删自己插入的记录:CREATE POLICY delete_own_data ON sensitive_data FOR DELETE USING (user_id = current_user);
  • 若需更严格控制(如禁止删除已归档数据),可在 USING 中加入复合条件:USING (user_id = current_user AND status != 'archived')

DELETE 策略不支持 WITH CHECK

WITH CHECK 只对涉及“写入新状态”的操作有效,比如 INSERT 和 UPDATE。而 DELETE 是移除整行,没有“新行值”可校验,因此语法上不允许 WITH CHECK 子句。

这意味着你无法用 RLS 阻止“因关联更新导致的间接删除”,比如触发器或 ON DELETE CASCADE。RLS 的 DELETE 限制仅作用于直接 DELETE 语句。

实操建议:

  • 不要尝试写 CREATE POLICY ... FOR DELETE WITH CHECK (...),会报错 syntax error at or near "WITH"
  • 如果业务要求“软删除”或状态驱动删除,应把逻辑放在 USING 条件中,例如:USING (user_id = current_user AND deleted_at IS NULL)
  • 级联删除不受 RLS 约束,需靠外键约束或应用层控制

FORCE ROW LEVEL SECURITY 影响 DELETE 行为

默认情况下,表所有者(owner)和超级用户(superuser)执行 DELETE 时会绕过 RLS 策略。如果你希望连所有者也受限制,必须启用强制模式:

ALTER TABLE sensitive_data FORCE ROW LEVEL SECURITY;

这个命令影响所有操作类型,包括 DELETE。一旦启用,所有角色(含所有者)都必须满足策略条件才能删除行。

容易踩的坑:

  • 误以为 ENABLE ROW LEVEL SECURITY 就够了——其实它只启用策略机制,不改变所有者豁免规则
  • 在生产环境执行 FORCE 前未测试运维账号行为,导致 DBA 无法紧急清理脏数据
  • FORCE 是表级开关,不能按用户或会话动态关闭;调试时需临时 DISABLE 再恢复

测试 DELETE 策略是否生效的关键步骤

光看 CREATE POLICY 成功不等于策略起作用。必须用目标用户身份连接并实测,否则容易漏掉权限或上下文问题。

实操建议:

  • 用 psql -U target_user -d dbname 切换到被限制用户,再执行 DELETE,观察是否报错 no rows to delete 或静默失败(取决于策略条件是否匹配)
  • 确认该用户确实有表级 DELETE 权限:GRANT DELETE ON sensitive_data TO target_user;,否则 RLS 根本不会触发(先卡在权限层)
  • 检查策略是否被禁用:SELECT polname, polcmd, polqual, polwithcheck FROM pg_policy WHERE polrelid = 'sensitive_data'::regclass;,确认 polcmd = 'D' 且 polqual 非空
  • 注意 current_user 和 session_user 差异:若使用连接池或代理,实际会话用户可能不是预期角色,建议统一用 current_user 并确保登录角色与策略逻辑一致
RLS 的 DELETE 控制本质是“过滤可操作的行”,不是“拦截语句”。哪怕策略条件写得再严,只要有一行匹配,DELETE 就会执行成功——所以策略表达式的边界 case(比如 NULL 值、大小写、时区)必须和业务数据严格对齐。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4309

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

627

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1376

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

460

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

150

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

881

2026.05.08

PostgreSQL高级特性、内核机制与现代数据架构
PostgreSQL高级特性、内核机制与现代数据架构

本专题从MVCC并发控制与WAL日志等内核机制出发,详解JSONB、PostGIS及pgvector等高级特性。探讨如何利用单一引擎支撑关系型、向量及图数据等现代数据架构需求,助您掌握构建高并发、智能化应用的核心技术。

224

2026.05.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn