如何按表名查询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
相关产品推荐
相关产品推荐

