2014-01-26 59 views
1

爲了從pgdump恢復我的數據我需要從數據庫中刪除自定義函數。
此功能識別它們得好:PostgreSQL,放置自定義函數

SELECT pp.proname 
    FROM pg_proc pp 
INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid) 
INNER JOIN pg_language pl on (pp.prolang = pl.oid) 
WHERE pl.lanname NOT IN ('c','internal') 
    AND pn.nspname NOT LIKE 'pg_%' 
    AND pn.nspname <> 'information_schema'; 

所以,後我聽到dynamic SQL,並確保我可以用它從.NET我嘗試運用它用於這一目的。

do 
$$ 
declare 
    func_rec record; 
begin 
    for func_rec in (SELECT pp.proname as funcname 
         FROM pg_proc pp 
        INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid) 
        INNER JOIN pg_language pl on (pp.prolang = pl.oid) 
        WHERE pl.lanname NOT IN ('c','internal') 
         AND pn.nspname NOT LIKE 'pg_%' 
         AND pn.nspname <> 'information_schema') 
    loop 
    execute 'drop function '||func_rec.funcname||' cascade'; 
    end loop; 
end; 
$$ 

在此期間,我發現爲了放下一個函數,我必須將它的參數提供給DROP命令。
下面是這些參數如何可以檢索一個example子查詢:

(SELECT typname FROM pg_type WHERE oid = funcrow.proargtypes[i]) 

現在仍然認爲,我不知道如何把那些在功能上的編碼,這將增加所需要的參數,以func_rec.funcname問題刪除這些功能。

因此,請幫助查詢從所有功能中刪除自定義功能。

回答

1

因爲函數可以在Postgres中重載,所以您需要在drop中包含該函數的簽名。

假設你有以下功能:

get_answer(p1 integer); 
get_answer(p1 integer, p2 integer); 

然後Postgres的不知道哪一個使用drop function get_answer;時下降。

幸運的是,Postgres有一個函數來格式化參數,以便它們可用於此目的:pg_get_function_identity_arguments

所以,你需要改變你的選擇:

SELECT pp.proname||'('||pg_get_function_identity_arguments(pp.oid)||')' as funcname 
    FROM pg_proc pp 
INNER JOIN pg_namespace pn on (pp.pronamespace = pn.oid) 
INNER JOIN pg_language pl on (pp.prolang = pl.oid) 
WHERE pl.lanname NOT IN ('c','internal') 
    AND pn.nspname NOT LIKE 'pg_%' 
    AND pn.nspname <> 'information_schema'; 
+0

是,預期和希望,現在正是工作。也來自pgAdmin和.NET。由於我的程序在啓動時自動創建了這些函數(如果不存在),我現在再次清理了這些函數的備份,並且沒有任何可靠的作業/問題。謝謝。 –