Tänk på:
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';
Se även:Vad är kommandot för att hitta skript för en befintlig funktion i postgresql?
Använd pg_get_functiondef
eller prosrc
kolumn från pg_proc
direkt. Nyckelidén är att gå med på pg_namespace
och filtrera bort PostgreSQL-katalogfunktionerna, som förmodligen kommer att vara tillräckliga för de flesta ändamål:
FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'
Problemet med att skaffa källkoden för användardefinierad funktioner avgör vilken användare betyder att. Många typer av funktioner kan skapas:
- Funktioner som använder
CREATE EXTENSION
. - Funktioner skapade av PostgreSQL.
- Funktioner kompilerade och installerade av en administratör.
Superanvändare med tillräckliga anslag kan definiera funktioner i pg_proc
, men vanligtvis inte.
Eftersom endast superanvändare kan skapa C-språkfunktioner, uteslut dem. Sådana funktioner kan specialinstalleras på en viss databas av administratören, men inte en normal användare.