驗證總帳資料表以偵測竄改
適用於:SQL Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體
在本文中,您將驗證總帳資料表中資料的完整性。 如果您已在資料庫上設定自動摘要儲存體,請遵循使用自動摘要儲存體的 T-SQL 一節。 否則,請遵循使用手動產生的摘要進行的 T-SQL 一節。
必要條件
- 如果您使用 Azure SQL 資料庫或 Azure SQL 受控執行個體,請擁有作用中的 Azure 訂用帳戶。 如果您沒有訂用帳戶,請建立免費帳戶。
- 建立和使用可更新的總帳資料表或建立和使用僅限附加的總帳資料表。
- SQL Server Management Studio 或 Azure Data Studio。
- 您必須先在資料庫上啟用資料庫選項 ALLOW_SNAPSHOT_ISOLATION,才能執行驗證預存程序。
執行資料庫的總帳驗證
使用 SQL Server Management Studio 或 Azure Data Studio 連線至資料庫。
使用下列 T-SQL 陳述式來建立新的查詢:
DECLARE @digest_locations NVARCHAR(MAX) = (SELECT * FROM sys.database_ledger_digest_locations FOR JSON AUTO, INCLUDE_NULL_VALUES);SELECT @digest_locations as digest_locations; BEGIN TRY EXEC sys.sp_verify_database_ledger_from_digest_storage @digest_locations; SELECT 'Ledger verification succeeded.' AS Result; END TRY BEGIN CATCH THROW; END CATCH
注意
也可以在 Azure 入口網站中找到驗證指令碼。 開啟 Azure 入口網站,並找出您想要驗證的資料庫。 在 [安全性] 中,選取 [總帳] 選項。 在 [總帳] 窗格中,選取 </> 驗證資料庫。
執行查詢。 您會看到 digest_locations 傳回資料庫摘要儲存所在的目前位置,以及任何先前的位置。 [結果] 會傳回總帳驗證成功或失敗。
開啟 digest_locations 結果集以檢視摘要的位置。 下列範例顯示此資料庫的兩個摘要儲存位置:
path 指出摘要的位置。
last_digest_block_id 指出 path 位置中所儲存之最後一個摘要的區塊識別碼。
is_current 指出 path 中的位置是目前位置 (true) 還是先前的位置 (false)。
[ { "path": "https:\/\/digest1.blob.core.windows.net\/sqldbledgerdigests\/janderstestportal2server\/jandersnewdb\/2021-05-20T04:39:47.6570000", "last_digest_block_id": 10016, "is_current": true }, { "path": "https:\/\/jandersneweracl.confidential-ledger.azure.com\/sqldbledgerdigests\/janderstestportal2server\/jandersnewdb\/2021-05-20T04:39:47.6570000", "last_digest_block_id": 1704, "is_current": false } ]
重要
當您執行總帳驗證時,請檢查 digest_locations 的位置,以確保驗證中使用的摘要是從您預期的位置所擷取。 您想確保特殊權限使用者在沒有設定及鎖定不變性原則的情況下,將摘要儲存體的位置變更為未受保護的儲存位置 (例如 Azure 儲存體)。
驗證會在 [結果] 視窗中傳回下列訊息。
如果您的資料庫中未遭到篡改,則訊息為:
Ledger verification successful
如果您的資料庫中遭到篡改,則 [訊息] 視窗中會出現下列錯誤:
Failed to execute query. Error: The hash of block xxxx in the database ledger doesn't match the hash provided in the digest for this block.