2016-06-29 8 views
2

Die PostgreSQL-Dokumentation beschreibt, wie Sie eine Zeilenrichtlinie erstellen oder löschen, , aber nicht, um eine Liste der vorhandenen zu erhalten. Mein Ziel ist es, mithilfe von pgAdmin wissen zu können, ob Zeilenrichtlinien eine Tabelle beeinflussen und wie sie funktionieren.Wie bekomme ich eine Liste von Zeilenrichtlinien in PostgreSQL?

Danke!

+1

ich die Antwort gefunden: alles in der pg_catalog.pg_policies Ansicht ist. –

Antwort

2

Es gibt eine Katalogansicht, die hält, was Sie wollen: pg_policy. Es ist ein wenig unklar, aber es hält, was Sie brauchen.

# \d pg_policy 
     Table "pg_catalog.pg_policy" 
    Column |  Type  | Modifiers 
--------------+--------------+----------- 
polname  | name   | not null 
polrelid  | oid   | not null 
polcmd  | "char"  | not null 
polroles  | oid[]  | 
polqual  | pg_node_tree | 
polwithcheck | pg_node_tree | 
Indexes: 
    "pg_policy_oid_index" UNIQUE, btree (oid) 
    "pg_policy_polrelid_polname_index" UNIQUE, btree (polrelid, polname) 
+0

Danke. Leider können Sie nicht sehen, was die Politik wirklich tut –

+2

Ho, mein Schlechter. Ich habe in der Tabelle pg_policy statt in der Ansicht pg_policies nachgesehen. Es hat alles, was ich brauchte! –

+0

Obskur ist korrekt. Kann jemand jetzt Tabellennamen bekommen, wahrscheinlich über 'polrelid'? – Alex

0

hilfreicher als Katalogsicht ist pg_policypg_policies. Sie sehen, auf welche Tabelle es angewendet wird und sogar, was die Richtlinie tut (obwohl das abgeschnitten scheint).

So laufen gerade: select * from pg_policies

, die zu diesem (dank @jmelesky) kocht eigentlich nach unten:

SELECT n.nspname AS schemaname, 
    c.relname AS tablename, 
    pol.polname AS policyname, 
     CASE 
      WHEN pol.polpermissive THEN 'PERMISSIVE'::text 
      ELSE 'RESTRICTIVE'::text 
     END AS permissive, 
     CASE 
      WHEN pol.polroles = '{0}'::oid[] THEN string_to_array('public'::text, ''::text)::name[] 
      ELSE ARRAY(SELECT pg_authid.rolname 
       FROM pg_authid 
       WHERE pg_authid.oid = ANY (pol.polroles) 
       ORDER BY pg_authid.rolname) 
     END AS roles, 
     CASE pol.polcmd 
      WHEN 'r'::"char" THEN 'SELECT'::text 
      WHEN 'a'::"char" THEN 'INSERT'::text 
      WHEN 'w'::"char" THEN 'UPDATE'::text 
      WHEN 'd'::"char" THEN 'DELETE'::text 
      WHEN '*'::"char" THEN 'ALL'::text 
      ELSE NULL::text 
     END AS cmd, 
    pg_get_expr(pol.polqual, pol.polrelid) AS qual, 
    pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check 
    FROM pg_policy pol 
    JOIN pg_class c ON c.oid = pol.polrelid 
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace; 
Verwandte Themen