2017-05-23 3 views
1

PostgreSQL stellt den Befehl \ dv zur Verfügung, um alle Ansichten aufzulisten. Gibt es eine ähnliche Möglichkeit, alle benutzerdefinierten Funktionen aufzulisten oder nur die Funktionen, die von einem bestimmten Benutzer definiert wurden? \ sf erfordert, dass Sie den Namen einer Funktion kennen und die Definition einer Funktion angeben. \ df listet alle Funktionen auf (und es gibt viele). Ich möchte einen Weg, um nur eine Liste der Funktionen zu zeigen, die ich definiert habe.Sie können alle benutzerdefinierten PostgreSQL-Funktionen auflisten?

Antwort

1

Der beste Weg, um eine solche Abfrage zu finden, ist psql mit der --echo-hidden Option zu verwenden. Führen Sie dann den Meta-Befehl psql aus, und Sie werden die Abfrage sehen, die verwendet wird.

Für \df dies:

SELECT n.nspname as "Schema", 
    p.proname as "Name", 
    pg_catalog.pg_get_function_result(p.oid) as "Result data type", 
    pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types", 
CASE 
    WHEN p.proisagg THEN 'agg' 
    WHEN p.proiswindow THEN 'window' 
    WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger' 
    ELSE 'normal' 
END as "Type" 
FROM pg_catalog.pg_proc p 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace 
WHERE pg_catalog.pg_function_is_visible(p.oid) 
     AND n.nspname <> 'pg_catalog' 
     AND n.nspname <> 'information_schema' 
ORDER BY 1, 2, 4; 

Sie das einstellen könnte zum Beispiel durch die sich wandelnde where-Klausel:

AND n.nspname = 'public' 

die zu \df public.* entspricht


Wenn Sie überprüfen the documentation of pg_proc werden Sie feststellen, dass es eine proowner Spalte, so dass Sie auch laufen konnte:

SELECT n.nspname as "Schema", 
     p.proname as "Name", 
     pg_catalog.pg_get_function_result(p.oid) as "Result data type", 
     pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types" 
FROM pg_catalog.pg_proc p 
    JOIN pg_catalog.pg_roles u ON u.oid = p.proowner 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace 
WHERE pg_catalog.pg_function_is_visible(p.oid) 
    AND n.nspname = 'public' 
    AND u.rolname = current_user --<< this limits the functions to those that the current user owns. 
0

Ich bin nicht sicher, ob dieser Befehl vollständig korrekt ist, aber es scheint mir alle Funktionen zu zeigen, die einer bestimmten Rolle gehören:

SELECT routine_name, grantee FROM information_schema.routine_privileges WHERE grantee = '<role>'; 

In jedem Fall gibt es mir die Ergebnisse, die ich erwarten würde zu sehen.

Verwandte Themen