You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按表名查询Postgres中启用/禁用的行级安全策略

查询PostgreSQL中按表名筛选的行级安全(RLS)策略信息

如果你需要按表名快速查找PostgreSQL里的行级安全(RLS)策略,不管是查看启用/禁用状态,还是找回忘记的策略名称,以下两种方法都能满足需求,尤其适合新手快速上手。

方法1:使用information_schema(推荐新手)

PostgreSQL的information_schema.policies视图提供了标准化的策略信息,字段直观易懂,无需熟悉复杂的系统表结构。

执行以下SQL,替换'target_table'和可选的模式名即可:

SELECT 
    table_schema,
    table_name,
    policy_name,
    policy_type,
    enabled,
    roles,
    using_clause,
    with_check_clause
FROM information_schema.policies
WHERE table_name = 'target_table' -- 替换为你要查询的表名
  AND table_schema = 'public'; -- 可选:指定表所在的模式,默认是public

返回字段说明:

  • table_schema:表所属的数据库模式
  • policy_name:策略名称(解决忘记策略名的问题)
  • enabled:策略是否启用(YES/NO)
  • roles:该策略适用的数据库角色列表
  • using_clause:控制行可见性的条件(SELECT/UPDATE/DELETE时生效)
  • with_check_clause:控制写入行的条件(INSERT/UPDATE时生效)

方法2:使用pg_catalog系统表(获取更全面的底层信息)

如果需要更详细的底层策略信息,或者information_schema未覆盖的内容(比如系统表的策略),可以直接查询PostgreSQL的系统表pg_policy,关联pg_class和pg_namespace获取表的元数据:

SELECT 
    n.nspname AS table_schema,
    c.relname AS table_name,
    p.polname AS policy_name,
    CASE p.polcmd
        WHEN 'r' THEN 'SELECT'
        WHEN 'a' THEN 'INSERT'
        WHEN 'w' THEN 'UPDATE'
        WHEN 'd' THEN 'DELETE'
        WHEN '*' THEN 'ALL'
    END AS policy_type,
    p.polenabled AS enabled,
    pg_get_userbyid(p.polrole) AS applicable_role,
    p.polqual AS using_clause,
    p.polwithcheck AS with_check_clause
FROM pg_policy p
JOIN pg_class c ON p.polrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE c.relname = 'target_table' -- 替换为目标表名
  AND n.nspname = 'public'; -- 可选:指定模式

这个查询的优势是能看到策略对应的原始操作指令(polcmd),并通过pg_get_userbyid直接转换出角色名称,比information_schema的roles字段更直观。

额外:查看表的RLS启用状态

如果只是想确认某张表是否开启了RLS,而非查询具体策略,可以用这个查询:

SELECT 
    n.nspname AS table_schema,
    c.relname AS table_name,
    c.relrowsecurity AS rls_enabled,
    c.relforcerowsecurity AS rls_enforced
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE c.relname = 'target_table'
  AND n.nspname = 'public';
  • rls_enabled:是否启用了RLS(t=启用,f=禁用)
  • rls_enforced:是否强制RLS生效(即使表的所有者也受策略限制)

注意事项

  • 权限要求:普通用户只能查看自己有权限访问的表的策略,超级用户可以查看所有策略。
  • 请替换SQL中的target_table和public为你实际的表名和模式名。

内容的提问来源于stack exchange,提问作者HighlandRocket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:20:28