2017-05-23 66 views
1

PostgreSQL提供命令\ dv列出所有視圖。是否有類似的方式來列出所有用戶定義的函數或者可能只是由特定用戶定義的函數? \ sf要求你知道一個函數的名字,它會提供一個函數的定義。 \ df列出了所有功能(並且有很多)。我想要一種方法來顯示我定義的函數列表。有沒有辦法列出所有用戶定義的PostgreSQL函數?

回答

1

查找此類查詢的最佳方法是使用psql--echo-hidden選項。然後運行psql元命令,您將看到使用的查詢。

對於\df是這樣的:

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; 

您可以通過例如調整該改變where子句:如果檢查the documentation of pg_proc你會發現有一個proowner列,所以你也可以運行

AND n.nspname = 'public' 

即相當於\df public.*


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

我不確定這個命令是否完全準確,但它似乎向我展示了特定角色擁有的所有功能:

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

無論如何,它給了我期望看到的結果。

相關問題