3 回答

TA貢獻1842條經(jīng)驗 獲得超21個贊
存儲過程是可以以兩種方式執(zhí)行的一批SQL語句。大多數(shù)主要的DBM支持存儲過程。但是,并非全部。您將需要與您的特定DBMS幫助文檔一起驗證具體信息。由于我最熟悉SQL Server,因此將其作為示例。
要創(chuàng)建存儲過程,語法非常簡單:
CREATE PROCEDURE <owner>.<procedure name>
<Param> <datatype>
AS
<Body>
因此,例如:
CREATE PROCEDURE Users_GetUserInfo
@login nvarchar(30)=null
AS
SELECT * from [Users]
WHERE ISNULL(@login,login)=login
存儲過程的一個好處是,您可以將數(shù)據(jù)訪問邏輯集中到一個位置,然后便于DBA優(yōu)化。存儲過程還具有安全優(yōu)勢,因為您可以授予存儲過程執(zhí)行權(quán)限,但用戶不需要對基礎(chǔ)表具有讀/寫權(quán)限。這是反對SQL注入的良好第一步。
存儲過程確實有缺點,基本上是與基本CRUD操作相關(guān)的維護。假設(shè)每個表都有一個Insert,Update,Delete以及至少一個基于主鍵的選擇,這意味著每個表將具有4個過程。現(xiàn)在,建立一個包含400個表的體面大小的數(shù)據(jù)庫,您就有1600個過程!并假設(shè)您沒有可能會重復(fù)的重復(fù)項。
在這里使用ORM或其他方法自動生成基本的CRUD操作有很多優(yōu)點。

TA貢獻1777條經(jīng)驗 獲得超3個贊
存儲過程是一組已創(chuàng)建并存儲在數(shù)據(jù)庫中的SQL語句。存儲過程將接受輸入?yún)?shù),因此多個客戶端可以使用不同的輸入數(shù)據(jù)在網(wǎng)絡(luò)上使用單個過程。存儲過程將減少網(wǎng)絡(luò)流量并提高性能。如果我們修改存儲過程,則所有客戶端都將獲取更新的存儲過程。
創(chuàng)建存儲過程的樣本
CREATE PROCEDURE test_display
AS
SELECT FirstName, LastName
FROM tb_test;
EXEC test_display;
使用存儲過程的優(yōu)點
存儲過程允許模塊化編程。
您可以創(chuàng)建一次該過程,將其存儲在數(shù)據(jù)庫中,然后在程序中多次調(diào)用它。
存儲過程可以加快執(zhí)行速度。
如果該操作需要重復(fù)執(zhí)行大量SQL代碼,則存儲過程可能會更快。首次執(zhí)行時,將對它們進行解析和優(yōu)化,并且存儲過程的編譯版本保留在內(nèi)存緩存中以備后用。這意味著不需要每次使用都重新解析和優(yōu)化存儲過程,從而大大縮短了執(zhí)行時間。
存儲過程可以減少網(wǎng)絡(luò)流量。
可以通過一條在過程中執(zhí)行代碼的語句來執(zhí)行需要數(shù)百行Transact-SQL代碼的操作,而不是通過網(wǎng)絡(luò)發(fā)送數(shù)百行代碼。
存儲過程為您的數(shù)據(jù)提供更好的安全性
即使沒有權(quán)限直接執(zhí)行該過程的語句,也可以向用戶授予執(zhí)行存儲過程的權(quán)限。
在SQL Server中,我們有不同類型的存儲過程:
系統(tǒng)存儲過程
用戶定義的存儲過程
擴展存儲過程
系統(tǒng)存儲的過程存儲在master數(shù)據(jù)庫中,這些過程以sp_前綴開頭。這些過程可用于執(zhí)行各種任務(wù),以支持系統(tǒng)表中外部應(yīng)用程序調(diào)用的SQL Server功能
示例:sp_helptext [StoredProcedure_Name]
用戶定義的存儲過程通常存儲在用戶數(shù)據(jù)庫中,并且通常旨在完成用戶數(shù)據(jù)庫中的任務(wù)。盡管編碼這些程序不使用的sp_前綴,因為如果我們使用的sp_第一個前綴,它會檢查主數(shù)據(jù)庫,然后它涉及到用戶定義的數(shù)據(jù)庫。
擴展存儲過程是從DLL文件調(diào)用函數(shù)的過程。如今,不建議使用擴展存儲過程,因為最好避免使用擴展存儲過程。
添加回答
舉報