Npgsql 6.0.2 发布,赶紧升级!!!
PostgreSQL 是一種特性非常齊全的自由軟件的對象-關系型數據庫管理系統(ORDBMS),是以加州大學計算機系開發的 POSTGRES,4.2版本為基礎的對象關系型數據庫管理系統。POSTGRES 的許多領先概念只是在比較遲的時候才出現在商業網站數據庫中。PostgreSQL 支持大部分的 SQL 標準并且提供了很多其他現代特性,如復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制等。同樣, PostgreSQL 也可以用許多方法擴展,例如通過增加新的數據類型、函數、操作符、聚集函數、索引方法、過程語言等。另外,因為許可證的靈活,任何人都可以以任何目的免費使用、修改和分發 PostgreSQL。
?PostgreSQL 數據庫在我們近幾年的項目系統中,使用的頻率極高。原因很簡單:免費、高效、強大!而在.NET項目中使用 PostgreSQL 數據庫,最常見的大概就是使用 Npgsql 作為驅動。
Npgsql在2021年11月9日,發布了全新的6.0.0版。從該版本開始 Npgsql 原生支持了多主機負載均衡和故障轉移、支持通過OpenTelemetry報告跟蹤數據、支持新 .NET 的 DateOnly 和 TimeOnly 類型等等。「還有一項被很多開發者忽視的改變」:出于性能優化的原因,參數名稱默認開始區分大小寫, 開發人員可以通過代碼
AppContext.SetSwitch("Npgsql.EnableLegacyCaseInsensitiveDbParameters",?true);控制 Npgsql 像舊版本一樣忽視參數大小寫。
其實呢,一些不嚴謹按大小寫區分的方式寫的 .NET 程序,在升級后由于默認區分大小寫讓程序爆出一些異常來,也是程序員們可以接受的。但是如果程序邏輯完全發生變化,甚至是毀滅性影響的話,你可能會欲哭無淚的。
?所以 Npgsql 緊急發布了「6.0.2」版本,還原為默認不區分大小寫了!
?為什么呢?源起有人在 Github 的 Npgsql 官方庫中,發布一條Issue,來說明默認區分大小寫帶來的一種毀滅性打擊。
意思就是,如果一條簡單的 SQL 語句如下:
delete?from?persons?where?"id"=@id本意是根據傳遞的id參數值,刪除對應的一行記錄。而如果在執行這個語句的時候傳的參數名不是小寫的id,而是寫成了Id。帶來的結果卻是把 persons 表內的數據全部刪除了!!!
roji 在隨后的回復中,說明了造成這個問題的是由于如下問題交織在一起后引發的:
PostgreSQL 數據庫本身不支持命名參數,而是使用參數位置代替的,也就是、2...
Npgsql 通過重寫 SQL 來支持的命名參數,將 @id 轉變為 $1
如果 Npgsql 在你的參數匹配時找不到對應名字的 NpgsqlParameter,則它不會翻譯這個參數,而是原樣輸出,也就是 @id
PostgreSQL 中,標識符可以使用@作為前綴,即數據庫會認為這是一個叫id的字段,所以 @id 與 id 會等同
上述問題疊合在一起后,原來的 SQL 語句實際變成了:
delete?from?persons?where?"id"=id等同于
delete?from?persons?where?1=1這問題在業務系統中絕對是毀滅性的。
所以,Npgsql 團隊在 6.0.2 版本中修改了默認開關值,使得默認不再區分大小寫。
「如果你正在使用 Npgsql 6.0.0或者 6.0.1 版,為了你的職業甚至生命安全,趕緊升級到6.0.2 吧」
總結
以上是生活随笔為你收集整理的Npgsql 6.0.2 发布,赶紧升级!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 死锁的原理与排查方法详解
- 下一篇: .NET 6新特性试用 | 可写JSON