2015-04-02 31 views
0

我想從我的Postgres數據庫中的所有模式中刪除一個函數。我有〜200架構,(t0000001,t0000002,t0000003 ...),我真的不喜歡手動。如何從所有模式中刪除函數

有沒有辦法做到這一點?

回答

2

你可以試試這個:

do $$ 
declare s record; 
begin 
    for s in select schema_name from information_schema.schemata loop 
    execute 'drop function if exists ' || s.schema_name || '.yourfunctionname()'; 
    end loop; 
end; $$; 
1

這將是非常低效遍歷數百模式,而功能可以在幾人只是存在。

另外DROP FUNCTION可以一下子全部放下。

並且Postgres支持函數重載,所以任何數量的函數都可以在相同的模式中存在,但具有不同的參數。每文檔:

參數類型的函數必須指定,因爲幾個 不同的功能,可以用相同的名字和不同的參數列表存在。

大膽重視我的。

這將刪除所有函數具有相同的基本名稱是可見的調用者(否則他無法刪除它)。
小心!

CREATE OR REPLACE FUNCTION f_delfunc(_name text) 
    RETURNS void AS 
$func$ 
BEGIN 

EXECUTE (
    SELECT string_agg(format('DROP FUNCTION %s(%s);' 
        ,oid::regproc 
        ,pg_catalog.pg_get_function_identity_arguments(oid)) 
      ,E'\n') 
    FROM pg_proc 
    WHERE proname = _name 
    AND pg_function_is_visible(oid)); 

END 
$func$ LANGUAGE plpgsql; 

相關答案更多的細節:

相關問題