Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
Super Marc, cela fonctionne à merveille, merci pour l'explication.
Hors ligne
Pages : 1