存儲(chǔ)過程的定義
存儲(chǔ)過程其實(shí)就是已預(yù)編譯為可執(zhí)行過程的一個(gè)或多個(gè)SQL語(yǔ)句。 通過調(diào)用和傳遞參數(shù)即可完成該存儲(chǔ)過程的功能。
CREATE PROC | PROCEDURE procedure_name
[{@參數(shù)數(shù)據(jù)類型} [=默認(rèn)值] [OUTPUT],
{@參數(shù)數(shù)據(jù)類型} [=默認(rèn)值] [OUTPUT],
....
]
AS
sql_statements
GO
存儲(chǔ)過程在創(chuàng)建階段可以帶參數(shù)或不帶參數(shù),不帶參數(shù)的一般是執(zhí)行一些不需要傳遞參數(shù)的語(yǔ)句就可以完成的功能,帶參數(shù)那就是需要傳遞參數(shù)的SQL語(yǔ)句,就像上面的示例,傳遞了兩個(gè)參數(shù)給SQL語(yǔ)句。帶參數(shù)的一定要定義參數(shù)類型,是字符型的還要定義長(zhǎng)度,給參數(shù)加默認(rèn)值是可選的。
存儲(chǔ)過程的優(yōu)點(diǎn)
提高性能
SQL語(yǔ)句在創(chuàng)建過程時(shí)進(jìn)行分析和編譯。 存儲(chǔ)過程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過程時(shí),查詢優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的存儲(chǔ)計(jì)劃,這樣,在執(zhí)行過程時(shí)便可節(jié)省此開銷。
降低網(wǎng)絡(luò)開銷
存儲(chǔ)過程調(diào)用時(shí)只需用提供存儲(chǔ)過程名和必要的參數(shù)信息,從而可降低網(wǎng)絡(luò)的流量。
便于進(jìn)行代碼移植
數(shù)據(jù)庫(kù)專業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。
更強(qiáng)的安全性
系統(tǒng)管理員可以對(duì)執(zhí)行的某一個(gè)存儲(chǔ)過程進(jìn)行權(quán)限限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問在通過網(wǎng)絡(luò)調(diào)用過程時(shí),只有對(duì)執(zhí)行過程的調(diào)用是可見的。 因此,惡意用戶無法看到表和數(shù)據(jù)庫(kù)對(duì)象名稱、嵌入自己的 Transact-SQL 語(yǔ)句或搜索關(guān)鍵數(shù)據(jù)。
使用過程參數(shù)有助于避免 SQL 注入攻擊。 因?yàn)閰?shù)輸入被視作文字值而非可執(zhí)行代碼,所以,攻擊者將命令插入過程內(nèi)的 Transact-SQL 語(yǔ)句并損害安全性將更為困難。
可以對(duì)過程進(jìn)行加密,這有助于對(duì)源代碼進(jìn)行模糊處理。
存儲(chǔ)過程的缺點(diǎn)
邏輯處理吃力
SQL本身是一種結(jié)構(gòu)化查詢語(yǔ)言,但不是面向?qū)ο蟮牡?,本質(zhì)上還是過程化的語(yǔ)言,面對(duì)復(fù)雜的業(yè)務(wù)邏輯,過程化的處理會(huì)很吃力。同時(shí)SQL擅長(zhǎng)的是數(shù)據(jù)查詢而非業(yè)務(wù)邏輯的處理,如果如果把業(yè)務(wù)邏輯全放在存儲(chǔ)過程里面,違背了這一原則。
修改參數(shù)復(fù)雜
如果需要對(duì)輸入存儲(chǔ)過程的參數(shù)進(jìn)行更改,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)、更新調(diào)用,等等,這時(shí)候估計(jì)會(huì)比較繁瑣了。
開發(fā)調(diào)試復(fù)雜
由于IDE的問題,存儲(chǔ)過程的開發(fā)調(diào)試要比一般程序困難。
無法應(yīng)用緩存
雖然有全局臨時(shí)表之類的方法可以做緩存,但同樣加重了數(shù)據(jù)庫(kù)的負(fù)擔(dān)。如果緩存并發(fā)嚴(yán)重,經(jīng)常要加鎖,那效率實(shí)在堪憂。
不支持群集
數(shù)據(jù)庫(kù)服務(wù)器無法水平擴(kuò)展,或者數(shù)據(jù)庫(kù)的切割(水平或垂直切割)。數(shù)據(jù)庫(kù)切割之后,存儲(chǔ)過程并不清楚數(shù)據(jù)存儲(chǔ)在哪個(gè)數(shù)據(jù)庫(kù)中。文章來源:http://www.zghlxwxcb.cn/news/detail-417852.html
存儲(chǔ)過程在業(yè)務(wù)量小的系統(tǒng)中應(yīng)用比較廣泛,將邏輯全部交給數(shù)據(jù)庫(kù)進(jìn)行處理,可以快速完成一些邏輯功能。但是針對(duì)業(yè)務(wù)量比較大的系統(tǒng),一般是禁止使用存儲(chǔ)過程的,因?yàn)閷?duì)數(shù)據(jù)庫(kù)的壓力太大。文章來源地址http://www.zghlxwxcb.cn/news/detail-417852.html
到了這里,關(guān)于SQL高級(jí)知識(shí)——存儲(chǔ)過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!