PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenez toutes les fonctions procédurales définies par l'utilisateur

Considérez :

select 
    pp.proname,
    pl.lanname,
    pn.nspname,
    pg_get_functiondef(pp.oid)
from pg_proc pp
inner join pg_namespace pn on (pp.pronamespace = pn.oid)
inner join pg_language pl on (pp.prolang = pl.oid)
where pl.lanname NOT IN ('c','internal') 
  and pn.nspname NOT LIKE 'pg_%'
  and pn.nspname <> 'information_schema';

Voir aussi :Quelle est la commande pour trouver le script d'une fonction existante dans postgresql ?

Utilisez pg_get_functiondef ou le prosrc colonne de pg_proc directement. L'idée clé est de rejoindre sur pg_namespace et filtrez les fonctions de catalogue PostgreSQL, qui seront probablement adéquates pour la plupart des besoins :

FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'

Le problème avec l'obtention du code source pour défini par l'utilisateur les fonctions décident quel utilisateur moyens. De nombreux types de fonctions peuvent être créés :

  • Fonctions utilisant CREATE EXTENSION .
  • Fonctions créées par PostgreSQL.
  • Fonctions compilées et installées par un administrateur.

Les super-utilisateurs disposant de droits suffisants peuvent définir des fonctions dans pg_proc , mais généralement pas.

Étant donné que seuls les superutilisateurs peuvent créer des fonctions en langage C, excluez-les. De telles fonctions peuvent être installées de manière personnalisée sur une base de données particulière par l'administrateur, mais pas par un utilisateur normal.