Rozważ:
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';
Zobacz też:Jakie jest polecenie, aby znaleźć skrypt istniejącej funkcji w postgresql?
Użyj pg_get_functiondef
lub prosrc
kolumna z pg_proc
bezpośrednio. Kluczowym pomysłem jest dołączenie do pg_namespace
i odfiltruj funkcje katalogu PostgreSQL, które prawdopodobnie będą wystarczające dla większości celów:
FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'
Problem z uzyskaniem kodu źródłowego dla zdefiniowanego przez użytkownika funkcje decydują o tym, który użytkownik oznacza. Można utworzyć wiele rodzajów funkcji:
- Funkcje za pomocą
CREATE EXTENSION
. - Funkcje stworzone przez PostgreSQL.
- Funkcje skompilowane i zainstalowane przez administratora.
Superużytkownicy z wystarczającymi grantami mogą definiować funkcje w pg_proc
, ale zwykle nie.
Ponieważ tylko superużytkownicy mogą tworzyć funkcje w języku C, wyklucz je. Takie funkcje mogą być instalowane na zamówienie w określonej bazie danych przez administratora, ale nie zwykłego użytkownika.