2017-08-10 96 views
2

我有一大組用戶定義的過程需要在幾個單獨的目錄(數據庫)上使用。如何在所有數據庫中創建postgres用戶定義的函數?

通常在pg_catalog.pg_proc中看到的內置過程似乎是 ,反映在所有數據庫的pg_catalog模式中。我希望在postgres數據庫中創建一個函數可能會使其全局可用,但是不會,無論是在postgres.pg_catalog還是postgres.public模式中創建。

有誰知道我怎麼可以讓用戶定義的程序普遍可用?

我嘗試僞造命名空間和所有者,授予執行公共,並在我的左肩(而不是在滿月)持有一隻黑貓。

將它設置爲擴展工作嗎? (這可能需要爲我環境的一些談判和finagling是我沒有嘗試過的唯一原因。)提前

感謝

+0

你可以把這個函數放在模板數據庫中,任何新的數據庫都可以擁有它。否則擴展是你最好的選擇 –

+0

讓它在模板中會讓它變成中途的一半,但是讓更多的同樣東西更新的維護令人頭疼。 我會嘗試擴展。 謝謝,尼爾。 – user8446599

+0

成功安裝了我的第一個postgres擴展,但它仍然有同樣的問題。 我在postgres架構中創建了它,並且可以在那裏成功調用它,但是從沙箱模式調用喚起'錯誤:函數...不存在'。投訴。 我不禁想到我錯過了其他需要完成的事情。 在postgres.pg_catalog.pg_available_extensions中,plpgsql以1.0作爲'installed_version'的值列出 - 這讓我認爲plpgsql本身 以這種方式加載。 (顯然它隨處可用。) 有什麼建議嗎? – user8446599

回答

2

PostgreSQL數據庫是相當隔離。你需要在每一箇中安裝你的擴展。這裏有一個shell腳本來緩解你的痛苦:

for DB in $(psql -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('postgres', 'template0', 'template1')"); do 
    psql -d $DB -c "CREATE EXTENSION IF NOT EXISTS foo" 
done 

或者這是一個數據庫,你正在談論多個模式?

+0

謝謝Neil,有幾個數據庫,每個數據庫都有多個模式,所以shell腳本理論上可行,但將它安裝到我們的安全模型中可能需要一分鐘;) – user8446599

+0

好方法。你可以用'-f user_func.ddl'替換嵌套的'-c「CREATE EXTENSION ...'來創建一個在所有文件中定義的函數。 – beldaz

相關問題