1. 程式人生 > >【機房重構】——儲存過程和觸發器

【機房重構】——儲存過程和觸發器

          引言

     在上一篇部落格中給大家介紹了觸發器的作用,那麼我在這篇部落格中給大家介紹一下儲存過程的知識,觸發器和儲存過程非常的相似,所以給大家介紹完儲存過程以後會通過對比這兩塊知識給大家總結一下。

      基本知識

    儲存過程(Stored Procedure)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。大概分為三類:系統、本地、臨時、遠端、擴充套件儲存過程幾類。

     作用

   1、儲存過程因為SQL語句已經預編繹過了,因此執行的速度比較快。    2、儲存過程可以從自己的儲存過程內引用其它儲存過程,這可以簡化一系列複雜語句。    3、儲存過程主要是在伺服器上執行,減少對客戶機的壓力。       4、儲存過程可以接受引數、輸出引數、返回單個或多個結果集以及返回值。可以向程式返回錯誤原因。     

    例項

  在機房收費系統中最讓我們頭疼的一個功能模組就是組合查詢功能,在這個系統中有四個一樣的窗體,其中的程式碼都是差不多的,都是根據不同的條件對不同的表進行查詢操作,在第一遍的時候,我們就理由字串的拼接完成一個後,就利用複製程式碼的手段來實現,這樣就會出現大量的重複程式碼,在重構的時候再次遇到這個問題,不會在重複的複製程式碼,而是用到了模板方法(在介紹組合查詢的時候詳細介紹)和儲存過程,下面給大家分享一下:
                                       
-- =============================================
-- Author:		鄭浩
-- Create date: 2014-12-26
-- Description:	用於組合查詢時和資料庫互動
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupCheck]  
    -- Add the parameters for the stored procedure here  
      
    @cobFieldName1 varchar(50),  
    @cobOperator1 varchar(50),  
    @txtContent1 varchar(50),  
    @cobFieldName2 varchar(50),  
    @cobOperator2 varchar(50),  
    @txtContent2 varchar(50),    
    @cobFieldName3 varchar(50),  
    @cobOperator3 varchar(50),  
    @txtContent3 varchar(50),    
    @cobRelations1 varchar(50),  
    @cobRelations2 varchar(50),  
    @tableName varchar(50)  
AS  
    declare @TempSql varchar(500)--臨時存放sql語句    
BEGIN  
     SET @TempSql='SELECT * FROM '
[email protected]
+' WHERE ' [email protected] [email protected]+char(39) + @txtContent1 + char(39) --SET @TempSql='SELECT * FROM '+'ZH_StudentInfo' +' WHERE ' [email protected] [email protected]+char(39) + @txtContent1 + char(39) if (@cobRelations1 is not null) BEGIN SET @[email protected][email protected]+CHAR(32)[email protected] [email protected]+CHAR(39)[email protected]+CHAR(39) if (@cobRelations2 is not null) BEGIN SET @[email protected][email protected]+CHAR(32)[email protected][email protected]+CHAR(39)[email protected]+CHAR(39) END END EXECUTE(@TempSql) END
  這樣我們的D層就非常的輕鬆了,只負責呼叫這個儲存過程和傳入相應的引數就可以了,這樣我們就可以傳進來的引數對不同的表進行操作了。

       觸發器 VS 儲存過程

   相同點

   兩者都是較複雜的SQL語句集,簡單的說觸發器是特殊的儲存過程,當我們在系統中需要對多個表進行同時操作的時候,我們就可以考慮用它們兩個,這樣是D層在實現複雜功能時壓力能小點。    當然我們在使用的時候需要綜合考慮一些問題,像程式碼的除錯和維護,資料庫的遷移(不同的資料庫支援的觸發器和儲存過程的格式不同)等問題。

   不同點

  一、觸發器不能用EXECUTE語句呼叫,當我們對資料庫中的表進行Update、Delete、Add等操作啟用自動執行的,而儲存過程是我們通過儲存器的名稱直接呼叫的。   二、觸發器是比較霸道的執行,只要我們滿足了觸發條件,使用者是不能控制執行的。而觸發器的執行是使用者在程式碼中控制呼叫的,這樣顯得比較靈活一些。

   小結

  觸發器和儲存過程有著很強大的作用,當我們藉助兩者的時候我們可以再D層用簡單的程式碼實現很複雜的功能,同時在很大程度上提高我們系統的效率,但是在使用的時候需要綜合考慮,不能過度的使用兩者。因為兩者不單可以破換資料庫的結構,給後期的程式碼除錯和維護也增加了負擔。所以,我們應該權衡利弊後在使用。