2012-08-27 66 views
10

我需要PostgreSQL數據庫對象的創建腳本。使用SQL查詢獲取Postgresql中函數,序列,類型等的定義

我還沒有訪問pg_dump。所以我必須使用SQL查詢來獲取所有內容。我怎麼能這樣做?

+1

對於單一功能的看'\ ef'其中「以」CREATE FUNCTION命令「的形式編輯[a]函數」(http://www.postgresql.org/docs/9.3/static/app-psql.html) –

回答

25

爲了得到一個函數的定義使用pg_get_functiondef()

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

有類似的功能檢索索引,視圖,規則等的定義。有關詳細信息,請參閱手冊:http://www.postgresql.org/docs/current/static/functions-info.html

獲取用戶類型的定義有點棘手。您將需要查詢information_schema.attributes爲:

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

從您需要重新組裝create type聲明。

有關詳細信息,您將需要通過系統目錄中的文檔閱讀:http://www.postgresql.org/docs/current/static/catalogs.html

但是,你應該更喜歡information_schema的意見,如果他們返回相同的信息。

+0

感謝您的回覆。我的數據庫中有大約8個用戶類型,但是當我查看information_schema.attributes時,有0行。任何想法? – John

+0

@John:不知道。你能發佈這些類型的定義嗎?要獲得更多詳細信息,請參閱Erwin的建議並使用-E開關啓動psql以查看它正在使用哪些statemtents。很可能涉及pg_type和pg_attribute。 –

11

你會發現psql -E有助於你尋求這些查詢。
它顯示查詢psql在執行反斜槓命令時使用 - 有關此函數的詳細信息,如\df+ myfunc

1

下面是使用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 
;; 

注意,很顯然你應該指定架構名稱,(或「公共」如果您正在使用該架構)

+0

請注意,我更喜歡這種格式,因爲我可以使用此查詢來搜索描述(我的基本功能文檔)或函數定義中包含特定文本的函數。 –

相關問題