2010-10-07 1 views
1

У меня есть веб-приложение, основанное на MapServer, которое использует PostGIS в качестве базового расширения базы данных. Теперь я хочу иметь выделенную роль базы данных, которая используется для MapServer, потому что я не хочу обращаться к базе данных через суперпользователь postgres. Эта роль должна иметь только разрешение SELECT для общедоступных таблиц (чего легко достичь) и разрешения EXECUTE для публичных функций PostGIS.Грант EXECUTE для многих функций PostGIS

Возникает несколько вопросов: все ли связанные с PostGIS функции, хранящиеся в общедоступной схеме базы данных, или есть что-то еще для рассмотрения?

Как я могу извлечь всю информацию о функциях - то есть имя функции, число и имена аргументов - из information_schema или pg_catalog базы данных ?! Мне нужна эта информация для GRANT EXECUTE для функции (args) для операторов MapServerUser!

Заранее спасибо!

ответ

1

В PostgreSQL 8.4.x:

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; 

Найдено, запустив Psql с параметром -E (показать скрытые запросов), а затем выполнив команду \ DF.

Кроме того, «общедоступная» схема в PostgreSQL называется именно так. Это не имеет особого значения. Это плохое имя. То, что вам нужно искать, это роль «ОБЩЕСТВЕННАЯ» (все кепки). Хотя таблицы не получают автоматически роль PUBLIC, мой опыт в том, что PUBLIC автоматически получает разрешение на выполнение функций, определенных с помощью SECURITY INVOKER.

+0

Я почти забыл: этот запрос показывает только определенные пользователем функции. Если вам нужны внутренние функции, вам нужно удалить часть «AND n.nspname <>« pg_catalog »из предложения WHERE. –

+0

Спасибо, это похоже на то, что я хочу. Поскольку я использую PostgreSQL 8.2.9, у меня нет функций pg_get_fuction_result (oid) и pg_get_function_arguments (oid), так что, возможно, вы знаете эквивалент 8.2. функции? Я искал их, но не мог найти их. Кроме того, столбца proiswindow не существует. –

+0

Запустите это в командной строке: "psql -E". Затем выполните команду psql «\ df». Он распечатает запрос, который он использует, для вывода списка функций (с параметрами и типами возврата). Это должно работать во всех версиях PostgreSQL. –

 Смежные вопросы

  • Нет связанных вопросов^_^