PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ottieni tutte le funzioni procedurali definite dall'utente

Considera:

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

Vedi anche:Qual ​​è il comando per trovare lo script di una funzione esistente in postgresql?

Usa pg_get_functiondef o il prosrc colonna da pg_proc direttamente. L'idea chiave è partecipare a pg_namespace e filtra le funzioni del catalogo PostgreSQL, che probabilmente saranno adeguate per la maggior parte degli scopi:

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

Il problema con l'ottenimento del codice sorgente per definito dall'utente funzioni sta decidendo quale utente significa. È possibile creare molti tipi di funzioni:

  • Funzioni che utilizzano CREATE EXTENSION .
  • Funzioni create da PostgreSQL.
  • Funzioni compilate e installate da un amministratore.

I superutenti con sufficienti sovvenzioni possono definire funzioni in pg_proc , ma di solito non lo fanno.

Poiché solo i superutenti possono creare funzioni in linguaggio C, escludile. Tali funzioni possono essere installate in modo personalizzato su un particolare database dall'amministratore, ma non da un normale utente.