2010-11-19 104 views
3

它們對數據庫管理員之外的任何內容都有用嗎?如果我正確理解它們,它只是可以直接保存到MySQL中的查詢,所以任何Web開發團隊都無法使用它們。存儲過程的要點是什麼?

回答

11

存儲過程是在數據庫服務器上運行的代碼。

它們有許多用途。認爲:如果我可以直接在數據庫服務器上運行代碼,那我可以使用哪些代碼?

在他們的許多用途,存儲過程可以用來換擋一些處理負載到數據庫服務器的,以減少網絡流量,提高安全性。

http://en.wikipedia.org/wiki/Stored_procedure

+0

更不用說它允許你使用像PL/V8的東西,並寫數據庫端* javascript * – 2014-05-01 02:32:49

+0

對位:https://blog.codinghorror.com/who-needs-stored-procedures-anyways/ – mfrankli 2017-06-13 16:21:57

+0

@mfrankli:當然。我的回答並不建議使用存儲過程的一切;只有在它們有用時才使用它們,而且效益大於成本。請記住,並非數據庫服務器上發生的所有事情都涉及數據檢索。 – 2017-06-13 16:40:45

1

存儲過程可以做的遠不止是查詢數據庫。它們可以包含任何T-SQL語句。因此,您可以使用它們來執行業務邏輯,執行查詢,執行備份等。

許多公司都有一個策略,即所有數據庫活動都要通過存儲過程完成。所以,現在我會說Web開發團隊對他們沒有用處。他們可能會很好地利用它們。

另一方面,在我們公司,我們並沒有將它們用於下一代製造應用。我們正在使用ORM(Linq-To-SQL),並且此時對存儲過程的使用很少。我懷疑,儘管我們仍然會在某種程度上使用它們,以避免多次往返於服務器。如果你已經在服務器上工作了,那麼在存儲過程中完成某些事情會更有效率。

0

把它們想象成任何正常程序中的程序。一種在單一調用方法下封裝邏輯塊的方法。

如果您認爲程序中的函數沒用,那麼這個對話在這裏結束。如果你認爲他們有用,那麼無處可去。沒有什麼能夠強制你使用它們,但是如果你應該選擇的話,它們是可用的。

+0

功能是我的觀點,我個人寧願有一個函數,其中包含的SQL,以免混淆看到我的代碼的其他人,所以他們知道一切都有一個地方......也許我只是不你們的水平... – Webnet 2010-11-19 18:09:45

+0

那麼,一些項目將有常用的查詢,到處都重複使用。而不是必須在一百萬個地方嵌入相同的SQL,而是嵌入一個存儲過程調用。這不僅僅是爲了DBA ...... – 2010-11-19 19:09:26

1

早在90年代,存儲過程是防止任何人直接訪問數據表的最安全的方法。

第一手的是,他們更有可能對付安全問題。其次,由於目前沒有ORM工具,因此它們更容易處理數據。

在這些日子裏,它們主要是針對複雜的交易。當我說複雜時,我的意思是用簡單的CRUD操作無法解決的問題,如NHibernate實體框架可以做的。

所以,當一個存儲過程只執行SELECT,一個INSERT,一個UPDATEDELETE,你可能是正確的,他們現在沒有用某種方式,你可以通過ORM工具執行這些基本的反覆操作。但是,例如,當您必須構建報告時,需要絕望的信息數據以及執行的其他一些計算等,並且結果計算起來相當複雜,那麼最好讓數據庫引擎按原樣工作旨在計算這些數據。

+0

不妨將CRUD的東西放入存儲過程中,因爲很難知道哪裏需要額外的業務規則,並且存儲過程爲您提供了額外的客戶端程序和你的數據。 – ObiWanKenobi 2010-11-19 17:52:11

+0

+1提到安全性,這是一個好點 – Webnet 2010-11-19 18:10:07

+0

也許你的數據是'絕望',但我只是'不同'= P – 2010-11-19 19:49:51

3

思考的存儲過程的庫函數。每次你必須計算平方根還是你想調用一個函數來重寫sqrt(例如)是否要重寫sqrt?

這就是存儲過程的好處(簡而言之)。

+0

+1簡而好的答案。 – 2011-06-20 23:29:56

+0

來吧人們,當你downvote,告訴我爲什麼(特別是事實後2年) – KevinDTimm 2012-12-18 02:44:12

2

存儲過程有很多好處。除此之外,它們還幫助將應用程序代碼與數據庫表分離,簡化數據庫維護和版本控制,並幫助充分利用DBMS功能,如查詢參數化,優化和安全性。

它會是無用的任何網絡 開發團隊使用他們

咦?對於任何需要使用支持它們的數據庫的開發人員來說,存儲過程都非常有用。

0

如果我理解正確的他們是 只是查詢可保存 直接到MySQL,那麼這將會是 沒用任何Web開發團隊 使用它們。

即使有了這個(有限)的定義,你暗示Web開發團隊永遠不需要查詢數據庫?真?

寫得很好的一組存儲過程可以完全刪除客戶端應用程序中的查詢,並用調用過程替換所有這些查詢。現在,我並不是說這是做事的唯一方式,甚至是正確的做法。總體來說,還有相當多的discussion。但這是使用它們的一種非常有效的方式。

那麼,對於webdev團隊來說沒用?

6

這裏是不包括在其他的答案兩個不錯的,簡單的優點:

  • 安全 - 參數化存儲過程是不是(在這個谷歌SQL注入約一億個文檔)contencating的SQL字符串但更安全,如果你的語言支持這些查詢,參數化查詢也是很好的
  • 簡化維護 - 更新存儲過程比重編譯代碼和重新部署要容易得多。在我15年的發展過程中,我已經學會了這個艱難的道路。如果查詢可能發生變化,請將其存儲在存儲過程中。與重新編譯和重新部署代碼相比,SOOO的工作容易得多。

新增

他們還減少網絡喋喋不休。如果你有很多複雜的wueries可以運行,你可以在一個存儲過程中使用它們,你的應用程序只需要一個電話就可以完成所有的工作。

此外,在大多數平臺中,存儲過程具有性能優勢。例如,在SQL Server中,數據庫引擎優化並保存執行計劃以加快速度。 這些鏈接也回答你的問題:

http://blog.sqlauthority.com/2007/04/13/sql-server-stored-procedures-advantages-and-best-advantage/

http://searchsqlserver.techtarget.com/news/1052737/Why-use-stored-procedures

我不能邀功這個答案,但我認爲這句話是一個很好的點,即使我認爲自己是在方程的兩邊都非常熟練 - 對於專業知識有一些要說的東西。

優勢四:存儲過程 通常由數據庫 開發商/管理員。持有這些角色的人員 通常更有 在編寫高效的 查詢和SQL語句方面經驗豐富。這釋放了 的GUI應用程序開發人員到 利用他們的技能在功能 和圖形演示文稿 該應用程序。如果你有你的 人員執行他們最適合的任務 最終會產生一個更好的整體 應用程序。

+0

我只在PHP工作,所以編譯不是一個問題。我可以看到哪裏會很痛苦...... +1對於「Advantage 4」包容性,非常好。 – Webnet 2010-11-19 18:13:52

0

除了這裏給出的所有答案,我還想指出,存儲過程是保存查詢執行計劃的一種方式。

您可能擁有一組您剛剛從應用程序中調用的SQL語句,但每次執行查詢時,SQL服務器都無法知道您剛剛調用的查詢與您調用的查詢完全相同幾分鐘前(這將在Web應用程序中頻繁發生)。所以SQL服務器必須重複所有的處理(構建查詢計劃並執行它)。

現在,如果相同的查詢被封裝在一個存儲過程中,SQL服務器會保存該存儲過程的執行計劃,以便每次調用該sproc時,都不必重新編譯執行計劃時間。 (它甚至可以緩存基於傳遞給存儲過程的參數數據,但我不知道這是怎樣工作)

1

除了其他人所說安全性,封裝,性能等的存儲過程,我我想補充一點,存儲過程的有用性隨着存儲過程語言的豐富性而增加。

我對MySQL沒有太多的經驗,但據我所知存儲過程語言相當有限。

T-SQL(在Microsoft SQL Server中)功能更強大,但與全功能編程語言相比有一些缺點。例如,不可能在T-SQL中聲明一個常量值,直到最近纔沒有異常處理,所以錯誤處理是一件很痛苦的事情。沒有包的概念,所以你的所有代碼都是獨立的程序,沒有辦法將它們組合在一起,除了一個好的命名約定。 (儘管確實可以使用.NET語言編寫存儲過程。)另一方面,PL/SQL(在Oracle中)是一種功能全面的編程語言,它具有複雜的數據類型,異常處理,用於分組程序(帶獨立的公共和私人部門),對象類型,以及很多很多,與一切從文件訪問壓縮和生成的網頁處理內置封裝。所有這一切,再加上與數據庫和SQL語言的無縫集成。可以使用PL/SQL構建整個應用程序,而不用「離開數據庫」。查看http://apex.oracle.com獲取以純PL/SQL實現的大規模(框架)應用程序的示例。

1

假設你在不同的表中插入兩行,第二個插入需要第一個ID。

$sql = "INSERT INTO t1 (f1,f2...) VALUES (v1, v2...)"; 
mysql_query($sql, $conn); 
$id = mysql_insert_id(); 
$sql2 = "INSERT INTO t2 (f1,f2,id,f3...) VALUES (v1,v2,$id,v3....); 
mysql_query($sql2,$conn)l 

您到數據庫兩次,兩個服務器請求/響應。如果你可以存儲INSERT,@ id = insert id,INSERT全部在my_proc服務器上的進程,你只需要做一次。

$sql = "CALL my_proc(arguments)"; 
mysql_query($sql); 
+0

在這篇文章中陳述的其他原因真的沒有關係,如果你用另一種語言連接到mysql,你可以使用該語言編寫函數。謝謝。 – 2014-12-03 23:40:42

0

與大多數ORM創建的代碼相比,更容易調整存儲過程中的代碼。當有多個應用程序訪問同一個數據庫並且可能需要做同樣的事情時,使用存儲過程更容易。當所有代碼都存儲在proc中時,重構數據庫要容易得多,因爲您可以輕鬆地看到需要進行更改的位置。對於通常不會連接到像SSIS或報告應用程序這樣的ORM的事物,使用存儲過程更加容易。使用存儲過程可以限制只有proc執行的操作,並且不允許直接訪問表或視圖。這對於強化財務數據的內部控制至關重要,並有助於防止欺詐行爲。

我寫了超過1000行的複雜特效。嘗試讓ORM編寫這種SQL。然後嘗試獲取它,以便它在沒有超時的情況下運行。

相關問題