列出所有用户定义的 PostgreSQL 函数的方法?

6

PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。

PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。

2个回答

13

找到这样的查询语句的最佳方法是使用带有--echo-hidden选项的psql命令。然后运行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子句来进行调整,例如:

AND n.nspname = 'public'

这相当于 \df public.*


如果您查看pg_proc的文档,您会注意到有一个 proowner 列,因此您也可以运行:

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.

TIL --echo-hidden。惊呆了。 - ehfeng

0

我不确定这个命令是否完全准确,但它似乎可以显示特定角色拥有的所有函数:

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

无论如何,它给我预期要看到的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接