SQL Server 中的預存程式是一或多個 Transact-SQL 語句的群組,或Microsoft .NET Framework Common Runtime Language (CLR) 方法的參考。 程式類似於其他程式設計語言的建構,因為它們可以:
接受輸入參數,並以輸出參數的形式傳回多個值給呼叫程式。
包含在資料庫中執行作業的程序設計語句。 這些包括呼叫其他程序。
將狀態值傳回給呼叫程式,以指出成功或失敗(以及失敗的原因)。
使用預存程式的優點
下列清單說明使用程式的一些優點。
減少伺服器/用戶端網路流量
程序中的指令會以單一批次的程式碼來執行。 這可大幅減少伺服器與用戶端之間的網路流量,因為只有執行該程序的呼叫會透過網路傳送。 如果沒有程式所提供的程式代碼封裝,每個個別程式代碼行都必須跨越網路。
安全性更強
多個使用者和用戶端程式都可以透過程序,在基礎資料庫物件上執行作業,即使使用者和程式不具備這些基礎物件的直接權限亦可。 程序也會控制要執行哪些程序和活動,並保護基礎資料庫物件。 這可避免在個別物件層級授與權限的需求,而簡化安全層。
EXECUTE AS 子句可以在 CREATE PROCEDURE 語句中指定,以啟用模擬其他使用者,或讓使用者或應用程式執行特定資料庫活動,而不需要基礎物件和命令的直接許可權。 例如,有些操作,例如 TRUNCATE TABLE,沒有可授與的許可權。 若要執行 TRUNCATE TABLE,用戶必須具有指定數據表的 ALTER 許可權。 授予使用者在數據表上的 ALTER 權限可能不是最佳選擇,因為使用者實際上除了截斷數據表的能力之外,還擁有遠超過此的許可權。 藉由將 TRUNCATE TABLE 語句併入模組中,並指定該模組以具有修改數據表許可權的使用者身分執行,您可以將許可權擴充為將數據表截斷至您在模組上授與 EXECUTE 許可權的使用者。
透過網路呼叫程式時,只會顯示執行程式的呼叫。 因此,惡意使用者看不到數據表和資料庫物件名稱、內嵌自己的 Transact-SQL 語句,或搜尋重要數據。
使用程式參數有助於防範 SQL 插入式攻擊。 由於參數輸入會被視為常值,而不是可執行文件程序代碼,因此攻擊者較難將命令插入程式內的 Transact-SQL 語句,並危害安全性。
程式可以加密,協助模糊化原始程式碼。 如需詳細資訊,請參閱 SQL Server 加密。
重複使用程序代碼
任何重複的資料庫操作代碼都是非常適合在程序中封裝的完美候選。 這可消除相同程式代碼的不必要的重寫、減少程式代碼不一致,並允許任何擁有必要許可權的使用者或應用程式存取和執行程序代碼。
更容易維護
當用戶端應用程式呼叫程序並將資料庫作業保留在資料層時,針對基礎資料庫中的任何變更,僅須更新程序。 應用層會保持個別,而且不需要知道資料庫配置、關聯性或進程的任何變更。
提升效能
根據預設,程式會在第一次執行時編譯,並建立後續執行重複使用的執行計劃。 由於查詢處理器不需要建立新的計劃,因此處理程式所需的時間通常較少。
如果程式所參考的數據表或數據發生了重大變更,則先行編譯計劃實際上可能會導致程序執行速度較慢。 在此情況下,重新編譯程式並強制新的執行計劃可以改善效能。
預存程序的類型
使用者定義
使用者定義程式可以在使用者定義資料庫或 資源資料庫以外的 所有系統資料庫中建立。 此程序可以在 Transact-SQL 開發,或作為 Microsoft .NET Framework 通用執行語言(CLR)方法的參考來開發。
臨時
臨時程式是使用者定義的程式形式。 暫存程式就像是永久程式,但暫存程式會儲存在 tempdb中。 暫時性程序有兩種類型:本地和全域。 它們在名稱、可見性和可用性方面有些差異。 本地臨時程序的名稱以單一數字符號(#)作為第一個字元;它們僅對當前用戶連接可見,且在連接關閉時會被刪除。 全域臨時程序名稱的前兩個字元有兩個數字元號(##);建立之後,所有使用者都能看到它們,並且在最後一個使用程序的會話結束時會被刪除。
系統
SQL Server 隨附系統程序。 它們會實際儲存在 內部、隱藏 的資源資料庫中,並以邏輯方式出現在每個系統和使用者定義資料庫的 sys 架構中。 此外, msdb 資料庫也包含 dbo 架構中用於排程警示和作業的系統預存程式。 因為系統程式從 前置詞sp_開始,建議您不要在命名使用者定義程式時使用此前置詞。 如需系統程式的完整清單,請參閱 系統預存程式 (Transact-SQL)
SQL Server 支援系統程式,提供從 SQL Server 到外部程式的介面,以進行各種維護活動。 這些擴充程式會使用 xp_ 前置詞。 如需擴充程式的完整清單,請參閱一般擴充預存程式(Transact-SQL)。
擴充 User-Defined
擴充程式可讓您以 C 之類的程式設計語言建立外部例程。這些程式是 SQL Server 實例可以動態載入和執行的 DLL。
備註
未來的 SQL Server 版本將會移除擴充預存程式。 請勿在新的開發工作中使用這項功能,並修改目前使用此功能的應用程式。 改為建立 CLR 程序。 此方法提供了一種更強固且安全的替代方案,用於撰寫擴展程序。
相關工作
| 工作描述 | 主題 |
| 描述如何建立預存程式。 | 建立預存程序 |
| 描述如何修改預存程式。 | 修改預存程序 |
| 描述如何刪除預存程式。 | 刪除預存程序 |
| 描述如何執行預存程式。 | 執行預存程式 |
| 描述如何授與預存程序的許可權。 | 授予預存程序許可權 |
| 描述如何將預存程式的數據傳回至應用程式。 | 從預存程式傳回數據 |
| 描述如何重新編譯預存程式。 | 重新編譯預存程式 |
| 描述如何重新命名預存程式。 | 重新命名預存程序 |
| 描述如何檢視預存程式的定義。 | 檢視預存程序的定義 |
| 描述如何檢視預存程式上的相依性。 | 檢視預存程序的相依性 |