Sql-Server

如何安全地通過整個數據庫成功解密列數據?

  • December 25, 2021

我們正在遷移到 Azure SqlDb,但作為其中的一部分,我們需要遷移, EncryptByPassPhrase因為它不受支持。

因此,我們在周末嘗試了這個過程,但我們遇到了日誌填滿並且腳本在中途停止的情況。

我在這裡有什麼選擇?在此過程中數據庫的使用率將為零,我可以/應該將數據庫暫時從完全恢復模式更改為簡單嗎?我真的不認為我們在乎過程中的個別交易,只關心最終結果。

此外,鑑於我們正在執行計算密集型任務 - 我是否應該暫時增加 CPU 資源以希望使其執行得更快?失敗了9個多小時,我想知道日誌是否受到干擾。

這是:

  • SQL 2019 (15.0.2000.5)
  • 數據庫兼容性為 150
  • 在此過程中,我們已禁用所有觸發器/作業

這是腳本的一部分:

DECLARE @Password VARCHAR(255) = '<some super cool long very high entropy password here>';

SET NOCOUNT ON;

DECLARE @TestDecryption VARCHAR(255);
SELECT TOP(1)@TestDecryption = CONVERT (VARCHAR(50), DECRYPTBYPASSPHRASE (@Password, HealthNumber_Enc))
FROM Patients.Patient
WHERE ProvinceCode = 'ON'
     AND HealthNumber_Enc IS NOT NULL
ORDER BY CreateDate DESC;
PRINT 'Test: ' + @TestDecryption;

IF @TestDecryption IS NOT NULL -- this is to ensure that our password actually works
BEGIN
   ; DISABLE TRIGGER ALL ON DATABASE;

   -- systematically decrypt data in all affected tables
   UPDATE Users.Activity
   SET [Description] = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Description_Enc)), [Description]);
   UPDATE Users.Activity
   SET Description_Enc = NULL;

   UPDATE Contact.[Address]
   SET Address1 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address1_Enc)), Address1), Address2 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address2_Enc)), Address2), Address3 = ISNULL (CONVERT (VARCHAR(1000), DECRYPTBYPASSPHRASE (@Password, Address3_Enc)), Address3), City = ISNULL (CONVERT (VARCHAR(255), DECRYPTBYPASSPHRASE (@Password, City_Enc)), City), PostalCode = ISNULL (CONVERT (VARCHAR(20), DECRYPTBYPASSPHRASE (@Password, PostalCode_Enc)), PostalCode), Latitude = ISNULL (CONVERT (DECIMAL(9, 6), CONVERT (VARCHAR(10), DECRYPTBYPASSPHRASE (@Password, Latitude_Enc))), Latitude), Longitude = ISNULL (CONVERT (DECIMAL(9, 6), CONVERT (VARCHAR(10), DECRYPTBYPASSPHRASE (@Password, Longitude_Enc))), Longitude);
   UPDATE Contact.[Address]
   SET Address1_Enc = NULL, Address2_Enc = NULL, Address3_Enc = NULL, City_Enc = NULL, PostalCode_Enc = NULL, Latitude_Enc = NULL, Longitude_Enc = NULL

   -- Some 50 other tables after here .. 

   ;ENABLE TRIGGER ALL ON DATABASE;
END;
ELSE BEGIN
PRINT 'Test Decryption returned NULL. Will not proceed!!';
END;

錯誤看起來像:

Msg 9002, Level 17, State 2, Procedure TRIG_Contact_Address_UPDATE_1, Line 26 [Batch Start Line 0]
The transaction log for database 'YourExampleDb' is full due to 'LOG_BACKUP'.

進行更頻繁的日誌備份和/或增加可用於日誌文件的磁碟空間。讓它在周末執行 48 小時。

我對您的系統一無所知,但增加 CPU 不太可能有幫助。

使用TOP(n)方法分批進行。

您可以監控事務日誌大小並相應地調整批處理大小。

如果您想將數據庫保持在完全恢復模式,那麼您可以備份日誌並根據需要縮小它。

引用自:https://dba.stackexchange.com/questions/252982