【发布时间】:2017-10-23 22:31:09
【问题描述】:
PostgreSQL 提供命令 \dv 来列出所有视图。是否有类似的方法来列出所有用户定义的函数,或者只是列出特定用户定义的那些函数? \sf 要求您知道函数的名称,它将提供函数的定义。 \df 列出了所有函数(并且有很多)。我想要一种方法来显示我定义的函数列表。
【问题讨论】:
标签: postgresql
PostgreSQL 提供命令 \dv 来列出所有视图。是否有类似的方法来列出所有用户定义的函数,或者只是列出特定用户定义的那些函数? \sf 要求您知道函数的名称,它将提供函数的定义。 \df 列出了所有函数(并且有很多)。我想要一种方法来显示我定义的函数列表。
【问题讨论】:
标签: postgresql
查找此类查询的最佳方法是将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 子句更改为:
AND n.nspname = 'public'
相当于\df public.*
如果您检查the documentation of 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.
【讨论】:
--echo-hidden。头脑。炸了。
我不确定此命令是否完全准确,但它似乎向我显示了某个特定角色拥有的所有功能:
SELECT routine_name, grantee FROM information_schema.routine_privileges WHERE grantee = '<role>';
无论如何,它给了我我期望看到的结果。
【讨论】: