2012-12-07 20 views

risposta

36

utilizzare pg_getfunctiondef; vedi system information functions. pg_getfunctiondef è stato aggiunto in PostgreSQL 8.4.

SELECT pg_get_functiondef('proc_name'::regproc); 

di scaricare tutte le funzioni in uno schema è possibile interrogare le tabelle di sistema in pg_catalog; dire se si voleva tutto da public:

SELECT pg_get_functiondef(f.oid) 
FROM pg_catalog.pg_proc f 
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid) 
WHERE n.nspname = 'public'; 

è banale per cambiare il sopra per dire "da tutti gli schemi ad eccezione di quelli che iniziano con pg_" invece se è quello che vuoi.

In psql si può scaricare a un file con:

psql -At dbname > /path/to/output/file.sql <<"__END__" 
... the above SQL ... 
__END__ 

Per eseguire l'output in un altro DB, usare qualcosa come:

psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name 

Se stai replicare funzioni tra DB come questo, tuttavia, considera l'archiviazione della copia autenticativa delle definizioni di funzione come uno script SQL in un sistema di controllo di revisione come svn o git, preferibilmente impacchettato come estensione PostgreSQL. Vedi packaging extensions.

+0

Anche io voglio ripristinare queste funzioni a un altro db. Come posso fare ciò? Funzioni solo bisogno di ripristinare – vmb

+0

@vmb L'output è definizioni di funzione SQL, quindi li pipa in psql. Vedi risposta aggiornata. Ancora meglio, crea un'estensione e inseriscili in essa. –

+1

Si noti che 'pg_get_functiondef ('proc_name' :: regproc)' ** NON esegue ** il dump dei privilegi della funzione (istruzioni 'GRANT' e' REVOKE') che possono essere talvolta considerati come parte della definizione della funzione. – NumberFour

17

Non è possibile indicare a pg_dump di scaricare solo le funzioni. Tuttavia, è possibile creare una discarica senza dati (-s) e filtrarla al momento del ripristino. Nota la parte -Fc: questo produrrà un file adatto per pg_restore.

togli prima la discarica:

pg_dump -U username -Fc -s -f dump_test your_database 

quindi creare un elenco delle funzioni:

pg_restore -l dump_test | grep FUNCTION > function_list 

E infine ripristinarli (-L specifica il file di elenco creato in precedenza):

pg_restore -U username -d your_other_database -L function_list dump_test 
+0

Forse i primi due comandi potrebbero essere ridotti a 'pg_dump -U nomeutente -s database | grep FUNCTION> function_list' – Minutis

+0

@Minutis Che non funzionerà, a meno che le definizioni delle funzioni non siano _all_ one-liner. – dezso

+1

Ho appena provato questo e posso confermare che la soluzione nel mio primo commento NON è corretta. – Minutis

Problemi correlati