2012-08-27 33 views
10

Tôi cần tạo tập lệnh cho các đối tượng cơ sở dữ liệu PostgreSQL.Nhận định nghĩa về chức năng, trình tự, loại vv trong Postgresql với truy vấn SQL

Tôi không truy cập được vào pg_dump. Vì vậy, tôi có để có được tất cả mọi thứ với các truy vấn SQL. Làm thế nào tôi có thể làm điều này?

+1

Đối với một chức năng duy nhất nhìn thấy '\ ef' mà" chỉnh sửa [a] chức năng dưới dạng lệnh CREATE FUNCTION "(http://www.postgresql.org/docs/9.3/static/app-psql.html) –

Trả lời

25

Để có được định nghĩa của một hàm sử dụng pg_get_functiondef():

select pg_get_functiondef(oid) 
from pg_proc 
where proname = 'foo'; 

Có chức năng tương tự để lấy định nghĩa của một chỉ số, một cái nhìn, một quy tắc và vân vân. Để biết chi tiết, hãy xem hướng dẫn sử dụng: http://www.postgresql.org/docs/current/static/functions-info.html

Định nghĩa kiểu người dùng phức tạp hơn một chút. Bạn sẽ cần phải truy vấn information_schema.attributes cho rằng:

select attribute_name, data_type 
from information_schema.attributes 
where udt_schema = 'public' 
    and udt_name = 'footype' 
order by ordinal_postion; 

Từ mà bạn cần phải tái lập lại các tuyên bố create type.

Để biết thêm chi tiết, bạn sẽ cần phải đọc qua các tài liệu của danh mục hệ thống: http://www.postgresql.org/docs/current/static/catalogs.html

Nhưng bạn nên thích information_schema lượt xem nếu họ trở về cùng một thông tin.

+0

Cảm ơn bạn đã trả lời. Tôi có khoảng 8 loại người dùng trong cơ sở dữ liệu của tôi nhưng khi tôi nhìn vào information_schema.attributes có 0 hàng. Bất kỳ ý tưởng? – John

+0

@ John: không có ý tưởng. Bạn có thể đăng định nghĩa của các loại đó không? Để có thêm thông tin chi tiết, hãy làm theo lời khuyên của Erwin và khởi động psql bằng cách sử dụng nút chuyển đổi -E để xem các statemtents mà nó đang sử dụng. Có lẽ một cái gì đó liên quan đến pg_type và pg_attribute. –

11

Bạn sẽ tìm thấy psql -E công cụ trong việc tìm kiếm các truy vấn đó.
Nó hiển thị các truy vấn psql sử dụng khi thực thi các lệnh dấu gạch chéo ngược - như \df+ myfunc để biết chi tiết về chức năng này.

1

Đây là một câu hỏi hoàn chỉnh mẫu sử dụng pg_get_functiondef:

WITH funcs AS (
    SELECT 
    n.nspname AS schema 
    ,proname AS sproc_name 
    ,proargnames AS arg_names 
    ,t.typname AS return_type 
    ,d.description 
    ,pg_get_functiondef(p.oid) as definition 
    FROM pg_proc p 
    JOIN pg_type t on p.prorettype = t.oid 
    JOIN pg_description d on p.oid = d.objoid 
    JOIN pg_namespace n on n.oid = p.pronamespace 
    WHERE n.nspname = 'some_schema_name_here' 
) 
SELECT * 
FROM funcs 
;; 

Lưu ý, bạn rõ ràng nên ghi rõ tên lược đồ, (hoặc "công cộng" nếu bạn đang sử dụng mà schema)

+0

Lưu ý, tôi thích định dạng này vì tôi có thể sử dụng truy vấn này để tìm kiếm các hàm chứa văn bản cụ thể trong mô tả (tài liệu hàm cơ bản của tôi) hoặc trong định nghĩa của hàm. –

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