是否可以在沒有 SSMS 的情況下編輯未加密的 SQL Server 備份文件 (*.bak) 中的數據?
我發現我的數據庫中的一個項目存在差異錯誤(剩餘數量 <>(購買 - 銷售))。到目前為止,有超過 5000 個項目和超過 100,000 筆交易。每次計算都執行相同的程序。
但只有一個項目有錯誤,而且只發生過一次。它似乎沒有從應用程序端發生,因為它已經執行了超過 100,000 次。數據庫伺服器沒有受到物理保護,也沒有連接到 Internet。只有我可以登錄伺服器。自從我記錄錯誤以來,程序中沒有發生任何異常。我不明白上述錯誤是如何發生的。
我已經看到可以使用記事本打開未加密的 SQL Server 備份文件並讀取其數據。以下情況是否可能?
- 使用live CD啟動伺服器並複制數據庫 .mdf 文件
- 編輯和更改它的數據(例如:一些數值)
- 用被黑的數據庫替換伺服器上的原始 .mdf 文件
如果上述情況不可能發生,是否有可能由於 SQL Server 端的錯誤或通信錯誤(而不是來自應用程式碼端)而發生這種情況。
是否可以在 SQL Server 實例停止時編輯數據文件:當然,頁面佈局和格式已經足夠好記錄了。不過聽起來不太可能,如果有人可以故意這樣做,他們可能會使用更簡單的方法來影響數據。
是否有可能以這種方式影響備份:是的。普通備份本質上是數據庫文件中已使用頁面的副本。但同樣不太可能。
更有可能的是,在我們通過網路傳輸的過程中,磁碟或記憶體中發生了位翻轉。這些是十億分之一(警告:這個數字是憑空挑選的,儘管我相信你會找到關於你想要一個實數的這種可靠性的研究)但是考慮到我們在機器上讀寫位的次數是多少所有人都會偶爾受到他們的影響。這就是存在諸如 ECC RAM 之類的東西的原因。
假設您的數據庫不夠古老(在 SQL Server 2005 之前的早期版本中創建)預設情況下沒有打開頁面校驗和並且您沒有明確關閉該功能,它會在每個頁面上保留一個校驗和值,可以用於檢測以這種方式引起的多種形式的損壞。您是否執行了完整的
DBCC CHECKDB
(請參閱https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkdb-transact-sql)以驗證您沒有可能發生的損壞以這種方式檢測?正如 Dan 在他的回答中所討論的那樣,如果未正確使用事務(根本未使用,或在隔離級別設置不足的情況下使用),則可能是導致問題的原因。