Voglio fare il backup di tutte le funzioni nel mio database postgres. Come fare il backup delle funzioni solo in Postgres?Come eseguire il backup delle funzioni solo in Postgres
risposta
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.
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
Forse i primi due comandi potrebbero essere ridotti a 'pg_dump -U nomeutente -s database | grep FUNCTION> function_list' – Minutis
@Minutis Che non funzionerà, a meno che le definizioni delle funzioni non siano _all_ one-liner. – dezso
Ho appena provato questo e posso confermare che la soluzione nel mio primo commento NON è corretta. – Minutis
Anche io voglio ripristinare queste funzioni a un altro db. Come posso fare ciò? Funzioni solo bisogno di ripristinare – vmb
@vmb L'output è definizioni di funzione SQL, quindi li pipa in psql. Vedi risposta aggiornata. Ancora meglio, crea un'estensione e inseriscili in essa. –
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