1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
優(yōu)點(diǎn)
SQL 在存儲(chǔ)過(guò)程中的優(yōu)點(diǎn)是:
抽象,您可以在不更改 .net 應(yīng)用程序的情況下重構(gòu)數(shù)據(jù)庫(kù)
安全性,您可以通過(guò)設(shè)置正確的執(zhí)行權(quán)限來(lái)進(jìn)行更好的安全檢查。您也可以限制數(shù)據(jù)集不輸出安全意識(shí)信息。
透明度:對(duì)數(shù)據(jù)庫(kù)執(zhí)行了哪些查詢(xún)?
查詢(xún)查詢(xún)的優(yōu)化,使用正確的索引等。
缺點(diǎn)
存儲(chǔ)過(guò)程中動(dòng)態(tài) SQL 的缺點(diǎn):
動(dòng)態(tài) SQL(在 SQL 服務(wù)器中)在安全性和性能方面可能很棘手。
安全
SQL Server 防止注入的“工具”較少。變量不能隨處使用,所以只有當(dāng)你硬編碼所有按選項(xiàng)排序的時(shí)候,你才是安全的。但是對(duì)于動(dòng)態(tài)過(guò)濾,這可能很困難。
例如這是安全的:
posts?=?context.Posts?? ????.FromSql("SELECT?*?FROM?mytable") ????.OrderByDescending(p?=>?p.CreateDate)
這是不安全的(是的,有更好的寫(xiě)法):
declare?varchar(200)?@orderby?=?'createDate?DESC' SET?@sqlCommand?=?'SELECT?*?FROM?mytable?ORDER?by?+?'@orderby EXEC?(@sqlCommand)
因此,您需要列出所有選項(xiàng)或選中所有選項(xiàng)。
表現(xiàn)
在性能方面,存儲(chǔ)過(guò)程中的動(dòng)態(tài) SQL可能會(huì)出現(xiàn)問(wèn)題。返回非常動(dòng)態(tài)數(shù)據(jù)的存儲(chǔ)過(guò)程可能會(huì)選擇錯(cuò)誤的查詢(xún)計(jì)劃,性能不佳。
*
您可以重新編譯每個(gè)存儲(chǔ)過(guò)程調(diào)用,但這也有缺點(diǎn)。
表值函數(shù)
另一種選擇是使用表值函數(shù) (TVF)。這些比存儲(chǔ)過(guò)程更受限制,但它們返回一個(gè)表,您可以對(duì)其進(jìn)行分頁(yè)和排序。
如上所述,它們具有存儲(chǔ)過(guò)程的優(yōu)點(diǎn),但沒(méi)有數(shù)據(jù)庫(kù)中動(dòng)態(tài) SQL 的缺點(diǎn)!
示例 TVF 和 EF Core
有一個(gè)很好的表值函數(shù)和 EF 示例,
.NET Core 與 TFV GetMatchingPostByTitle
posts?=?context.Posts?? ????.FromSql("SELECT?*?FROM?dbo.GetMatchingPostByTitle({0})",?searchTerm) ????.Where(p?=>?p.BlogId?==?1) ????.OrderByDescending(p?=>?p.CreateDate) ????.ToList();
將生成此 SQL:
- 1 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報(bào)