使用存儲過程的一些原因:
- 他們可能經歷了一些測試,確保他們做的 不允許破壞業務規則,以及一些優化 的性能。
- 他們確保結果的一致性。每當您被要求執行任務X時,您都會運行與任務X關聯的存儲過程。 如果您編寫查詢,則可能無法每次都以相同方式寫入; 也許有一天,你會忘記一些愚蠢的事情,比如在比較之前強行將文本強制爲 。
- 他們開始採取稍長不僅僅是一個查詢來寫,但 運行存儲過程花費的時間比寫再次查詢 時間要少。運行足夠多的時間,讓 寫入存儲過程變得更高效。
- 他們減少或消除需要知道 基礎表的關係。
- 您可以授予在基礎表上執行存儲過程(與
security definer
),但拒絕權限的權限。
- 程序員(如果你單獨的數據庫管理員和程序員)可以提供 API,而這一切,他們需要知道的。只要您在更改數據庫時維護 API,就可以在不破壞軟件的情況下對基本關係進行必要的更改 ;的確, 你甚至不需要知道他們用你的API做了什麼。
您可能會最終爲每個要執行的查詢創建一個存儲過程。
我不知道爲什麼你認爲這是低效率的,或特別費時相比,只是編寫查詢作爲。如果你只是把查詢放入存儲過程中,額外的工作應該是最小的。
CREATE OR REPLACE FUNCTION aSchema.aProcedure (
IN var1 text,
IN var2 text,
OUT col1 text,
OUT col2 text
)
RETURNS setof record
LANGUAGE plpgsql
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
SET search_path = aSchema, pg_temp
AS $body$
BEGIN
RETURN QUERY /*the query you would have written anyway*/;
END;
$body$;
GRANT EXECUTE ON FUNCTION aSchema.aProcedure(text, text) TO public;
,正如你在前面的問題時,該功能可以更加動態的通過傳遞列/表作爲參數,並使用EXECUTE(雖然這會增加執行功能的人多少需要了解如何功能作品,所以我儘量避免它)。
如果「效率較低」來自函數中包含的其他邏輯,則與僅使用查詢的比較不公平,因爲該函數正在執行額外的工作。
如果使用存儲過程,連接到數據庫的用戶不需要對基表具有任何直接權限 - 他們只需要能夠執行存儲過程。這可以是一個非常有用的安全措施 – 2012-03-01 09:50:18
是的,我明白,但我們必須創建這麼多的存儲過程,有沒有更有效的方法來做到這一點?也許你可以查看我上面的最後一個問題。如果我必須創建過程,我們如何有效地創建過程? – 2012-03-01 10:01:09
在[相關文章dba.SE](http://dba.stackexchange.com/q/8119/3684)中,您可以找到關於PostgreSQL中存儲過程的性能和特性與原始查詢的大量信息和鏈接。 – 2012-03-08 01:02:36