我想要用户可以执行的每个可能功能的完整列表。
如果我以 psql 中的用户身份连接,我可以\df
用来获取数据库中的函数列表。但这并没有列出 MAX()、COUNT()、pg_advisory_lock() 等函数。它还列出了用户一开始就无法执行的函数。
我想要用户可以执行的每个可能功能的完整列表。
如果我以 psql 中的用户身份连接,我可以\df
用来获取数据库中的函数列表。但这并没有列出 MAX()、COUNT()、pg_advisory_lock() 等函数。它还列出了用户一开始就无法执行的函数。
好吧,该列表非常广泛,但是您可以使用以下查询来实现:
SELECT oid::regproc
FROM pg_proc
WHERE has_function_privilege(oid,'execute');
该has_function_privilege
函数带有两个参数,检查该函数(作为第一个参数提供)是否具有对当前用户的特权(来自第二个参数)。您还可以使用带有三个参数的变体并作为第一个通知用户:
SELECT oid::regproc
FROM pg_proc
WHERE has_function_privilege('your_user_name',oid,'execute');
当然,我们可以改进输出psql
(改编自psql
's 查询):
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.has_function_privilege(p.oid, 'execute')
ORDER BY 1, 2, 4;