2012-12-07 14 views

Trả lời

36

sử dụng pg_getfunctiondef; xem system information functions. pg_getfunctiondef đã được thêm vào trong PostgreSQL 8.4.

SELECT pg_get_functiondef('proc_name'::regproc); 

Để đổ tất cả các hàm trong lược đồ, bạn có thể truy vấn bảng hệ thống trong pg_catalog; nói nếu bạn muốn tất cả mọi thứ từ 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'; 

nó tầm thường để thay đổi ở trên để nói "từ khắp nơi schemas trừ bắt đầu với pg_" thay vì nếu đó là những gì bạn muốn.

Trong psql bạn có thể đổ này vào một tập tin với:

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

Để chạy đầu ra trong một DB, sử dụng một cái gì đó như:

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

Nếu bạn đang sao chép chức năng giữa DBS như điều này, tuy nhiên, hãy xem xét lưu trữ bản sao có thẩm quyền của các định nghĩa hàm như một kịch bản lệnh SQL trong một hệ thống kiểm soát sửa đổi như svn hoặc git, tốt hơn là đóng gói như là một phần mở rộng PostgreSQL. Xem packaging extensions.

+0

Ngoài ra tôi muốn khôi phục các chức năng này để db.Bow khác tôi có thể làm điều đó ?? Chức năng chỉ cần khôi phục lại – vmb

+0

@vmb Đầu ra là định nghĩa hàm SQL, do đó, ống chúng vào psql. Xem câu trả lời cập nhật. Thậm chí tốt hơn, tạo một phần mở rộng và gói chúng trong đó. –

+1

Cần lưu ý rằng 'pg_get_functiondef ('proc_name' :: regproc)' ** KHÔNG ** bỏ các đặc quyền của hàm (các câu lệnh 'GRANT' và' REVOKE') đôi khi có thể được coi là một phần của định nghĩa hàm. – NumberFour

17

Bạn không thể yêu cầu pg_dump chỉ đổ các chức năng. Tuy nhiên, bạn có thể tạo một bãi chứa không có dữ liệu (-s) và lọc nó trên khôi phục. Lưu ý phần -Fc: điều này sẽ tạo một tệp phù hợp cho pg_restore.

Đầu tiên lấy bãi:

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

Sau đó tạo một danh sách các chức năng:

pg_restore -l dump_test | grep FUNCTION > function_list 

Và cuối cùng khôi phục chúng (-L xác định tập tin danh sách đã tạo ở trên):

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

Có thể hai lệnh đầu tiên có thể được giảm xuống thành cơ sở dữ liệu 'pg_dump -U username -s | grep FUNCTION> function_list' – Minutis

+0

@Minutis Điều đó sẽ không hoạt động, trừ khi định nghĩa hàm là _all_ một lớp lót. – dezso

+1

Chỉ cần cố gắng này bản thân mình và có thể xác nhận rằng giải pháp trong bình luận đầu tiên của tôi là không chính xác. – Minutis

Các vấn đề liên quan