天天看點

search_path在PostgreSQL函數開發中的注意事項

postgresql 與大多數資料庫一樣,通過schema,邏輯上劃分對象的歸屬,如圖。

search_path在PostgreSQL函數開發中的注意事項

使用者還可以參考《postgresql 邏輯結構 和 權限體系 介紹》

<a href="https://yq.aliyun.com/articles/41210">https://yq.aliyun.com/articles/41210</a>

因為有了schema的概念,在通路資料庫中的對象時,我們需要指定是哪個schema下面的。

例如schema_a.table。

為了友善使用者使用,postgresql 還有一個用戶端的環境參數叫search_path,用來控制搜尋路徑的順序。

例如 search_path= '"$user",public' 表示優先搜尋與目前使用者名同名的schema,如果沒有則搜尋public schema。

例如 目前使用者為a, 在資料庫中有一張表是a.tbl還有一張表public.tbl。 那麼select * from tbl,通路的是a.tbl。

我們在寫函數時,很容易忽略一點,就是搜尋路徑。

比如我寫了一個這樣的函數

會有點亂哦,tbl_core_bus表到底是哪個schema下的呢?

與search_path有關,是以如果在search_path中沒有這個表時,通路這個函數就會報錯。

是以在寫函數時務必注意,使用schema,避免這種問題。

上面的函數可以改成如下,在通路對象的前面加上schema表示

或者改成如下,設定函數的參數search_path

或者改成如下,在函數内使用set指令設定search_path

祝大家玩得開心,歡迎随時來 阿裡雲促膝長談業務需求 ,恭候光臨。

阿裡雲的小夥伴們加油,努力 做好核心與服務,打造最貼地氣的雲資料庫 。