2013-09-12 3 views
2

Я хочу получить полный список всех возможных функций, которые пользователь может выполнить.Список всех функций, которые могут быть выполнены пользователем

Если я подключаюсь как пользователь в psql, я могу использовать \df, чтобы получить список функций в базе данных. Но это не перечисляет такие функции, как MAX(), COUNT(), pg_advisory_lock() и т. Д. В нем также перечислены функции, которые пользователь не может выполнить в первую очередь.

ответ

3

Ну, список довольно обширен, но вы можете добиться этого с помощью следующего запроса:

SELECT oid::regproc 
FROM pg_proc 
WHERE has_function_privilege(oid,'execute'); 

The 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; 
Смежные вопросы