PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。
PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。
PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。
PostgreSQL提供了命令\dv来列出所有视图。是否有类似的方法可以列出所有用户定义的函数或者只是特定用户定义的函数?\sf需要您知道函数的名称,它将提供函数的定义。\df列出所有函数(数量很多)。我想要一种方式来只显示我定义的函数列表。
找到这样的查询语句的最佳方法是使用带有--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.
我不确定这个命令是否完全准确,但它似乎可以显示特定角色拥有的所有函数:
SELECT routine_name, grantee FROM information_schema.routine_privileges WHERE grantee = '<role>';
无论如何,它给我预期要看到的结果。
--echo-hidden
。惊呆了。 - ehfeng