2012-12-07 9 views

Odpowiedz

36

użyj pg_getfunctiondef; patrz system information functions. pg_getfunctiondef został dodany w PostgreSQL 8.4.

SELECT pg_get_functiondef('proc_name'::regproc); 

Aby zrzucić wszystkie funkcje w schemacie można wyszukać tabele systemowe w pg_catalog; powiedzieć, jeśli chciał wszystko od 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'; 

to trywialne, aby zmienić powyższe powiedzieć „od wszystkich schematów wyjątkiem poczynając pg_ zamiast Jeśli to, co chcesz.

W psql można zrzucić to do pliku z:

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

Aby uruchomić produkcję w innym DB, użyć czegoś takiego:

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

Jeśli funkcje replikacji pomiędzy DB jak to jednak rozważa przechowywanie autorytatywnej kopii definicji funkcji jako skryptu SQL w systemie kontroli wersji, takim jak svn lub git, najlepiej w postaci rozszerzenia PostgreSQL. Zobacz packaging extensions.

+0

Również chcę przywrócić te funkcje do innego db.How mogę to zrobić?. Funkcje tylko trzeba przywrócić – vmb

+0

@vmb Dane wyjściowe są definicje funkcji SQL, więc potokuj je do psql. Zobacz zaktualizowaną odpowiedź. Co więcej, utwórz rozszerzenie i spakuj je w nim. –

+1

Należy zauważyć, że 'pg_get_functiondef ('proc_name' :: regproc)' ** NIE ** zrzuca przywilejów funkcji (instrukcje 'GRANT' i' REVOKE'), które mogą być czasami uważane za część definicji funkcji. – NumberFour

17

Nie można powiedzieć pg_dump tylko zrzutu funkcji. Można jednak wykonać zrzut bez danych (-s) i odfiltrować go podczas przywracania. Uwaga: część -Fc: spowoduje utworzenie pliku odpowiedniego dla pg_restore.

Pierwszy wziąć zrzut:

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

następnie utworzyć listę funkcji:

pg_restore -l dump_test | grep FUNCTION > function_list 

i wreszcie przywrócić je (-L określa plik utworzonej listy powyżej):

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

Być może pierwsze dwie komendy można zredukować do 'pg_dump -U nazwa_użytkownika -s baza danych | grep FUNCTION> function_list' – Minutis

+0

@Minutis To nie zadziała, chyba że definicje funkcji są _jednostkowymi. – dezso

+1

Po prostu wypróbowałem to sam i mogę potwierdzić, że to rozwiązanie w moim pierwszym komentarzu NIE jest poprawne. – Minutis

Powiązane problemy