PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 09/06/2011 09:42:44

mortimer.pw
Membre

GRANT sur Fonctions Utilisateurs

Bonjour à tous,

Je travaille sur des bases supérieures à 8.0 sous Red-Hat et Cent-OS.

Je souhaite donner le droit d'exécution sur un paquet de Fonctions Utilisateurs.

J'ai la syntaxe : GRANT EXECUTE ON FUNCTION nomfonction (typearg) TO nomrole.

J'ai trouvé la table pg_proc qui contient la liste des Fonctions.


Mon problème est de récupérer la liste des types des arguments.
Est-ce le champ proargtypes ?
Et ensuite faut-il croiser avec la table pg_type ?
Il s'agit d'un tableau de vecteurs, comment avoir les noms des types ?

Pouvez-vous m'apporter de l'aide ?

Merci par avance.

Hors ligne

#2 09/06/2011 10:00:11

Marc Cousin
Membre

Re : GRANT sur Fonctions Utilisateurs

proargtypes est un vecteur d'oid (un tableau…), des oid de types. On peut donc ruser. Mais je vais expliquer un peu, parce que sinon, ça sera juste une recette de cuisine smile

Un oid est un identifiant d'objet. On peut demander au moteur de convertir directement cet oid par une fonction, plutôt que par une jointure, histoire que ça soit un peu plus lisible. C'est expliqué ici : http://docs.postgresqlfr.org/9.0/datatype-oid.html

Ce qui est encore plus pratique, c'est que forcer un cast de l'oid vers le bon type retourne directement son nom dans la table système associée.

Par exemple:

SELECT oid from pg_class where relname ='test';
  oid 
-------
16949
(1 row)

marc=# SELECT 16949::regclass;
regclass
----------
test

En utilisant le cast vers regclass, je lui dis que mon oid est une classe (entrée dans pg_class, c'est à dire une table, une vue, un toast, un index…).

Dans notre cas, nous avons un vecteur d'oid qui pointent vers pg_type. Il faut donc faire le cast vers un tableau de regtypes:

SELECT proname, proargtypes::regtype[] from pg_proc limit 5 offset 50;
proname |              proargtypes             
---------+---------------------------------------
textcat | [0:1]={text,text}
boolne  | [0:1]={boolean,boolean}
version | {}
eqsel   | [0:3]={internal,oid,internal,integer}
neqsel  | [0:3]={internal,oid,internal,integer}
(5 rows)

Le limit et l'offset, c'est juste pour avoir peu de données, mais intéressantes.

Bon, évidemment, ça n'est pas encore un format bien pratique. Utilisons maintenant une fonction de tableau:


SELECT proname, array_to_string(proargtypes::regtype[],',') from pg_proc limit 5 offset 50;
proname |        array_to_string       
---------+-------------------------------
textcat | text,text
boolne  | boolean,boolean
version |
eqsel   | internal,oid,internal,integer
neqsel  | internal,oid,internal,integer


Marc.

Hors ligne

#3 09/06/2011 10:27:15

mortimer.pw
Membre

Re : GRANT sur Fonctions Utilisateurs

Super Marc, cela fonctionne à merveille, merci pour l'explication.

Hors ligne

Pied de page des forums