2010-10-07 3 views
1

J'ai une application Web basée sur MapServer, qui utilise PostGIS comme extension de base de données sous-jacente. Maintenant, je veux avoir un rôle de base de données dédié qui est utilisé pour MapServer, parce que je ne veux pas accéder à la base de données via le superutilisateur postgres. Ce rôle ne doit avoir que l'autorisation SELECT sur les tables publiques (ce qui est facile à réaliser) et les autorisations EXECUTE sur les fonctions PostGIS publiques.Accorder EXECUTER à de nombreuses fonctions PostGIS

Plusieurs questions se posent: Toutes les fonctions pertinentes de PostGIS sont-elles stockées dans le schéma public d'une base de données ou y a-t-il autre chose à considérer?

Comment puis-je extraire toutes les informations sur les fonctions - c'est-à-dire le nom de la fonction, le numéro et les noms des arguments - à partir du schéma d'information ou du catalogue de la base de données? J'ai besoin de cette information pour le GRANT EXECUTE sur la fonction (args) aux instructions MapServerUser!

Merci d'avance !!!

Répondre

1

Dans 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; 

Trouvé en exécutant psql avec le paramètre -E (show de requêtes cachées), puis exécutez la commande \ df.

De plus, le schéma "public" dans PostgreSQL est simplement nommé ainsi. Cela n'a pas de signification particulière. C'est un mauvais nom. Qu'est-ce que vous devez faire attention est le rôle "PUBLIC" (toutes les capitales). Alors que les tables ne reçoivent pas automatiquement le rôle PUBLIC, mon expérience est que PUBLIC obtient automatiquement l'autorisation d'exécution sur les fonctions définies avec SECURITY INVOKER.

+0

J'ai presque oublié: cette requête affiche uniquement les fonctions définies par l'utilisateur. Si vous avez besoin des fonctions internes, vous devez supprimer la partie "AND n.nspname <> 'pg_catalog'" de la clause WHERE. –

+0

Merci, cela semble proche de ce que je veux. Comme j'utilise PostgreSQL 8.2.9, je n'ai pas les fonctions pg_get_fuction_result (oid) et pg_get_function_arguments (oid), alors peut-être connaissez-vous l'équivalent 8.2. les fonctions? Je les ai cherchés mais je n'ai pas pu les trouver. En outre, la fenêtre proiswindow n'existe pas. –

+0

Exécutez ceci sur la ligne de commande: "psql -E". Ensuite, lancez la commande psql "\ df". Il imprime la requête qu'il utilise pour afficher la liste des fonctions (avec les paramètres et les types de retour). Cela devrait fonctionner dans toutes les versions de PostgreSQL. –

Questions connexes