Чтобы быть уверенным, что вы не потеряете данные при изменении базы данных, вы можете создать сценарии для подтверждения новой структуры, а старая содержит те же логические данные. Например, скажем, версия 1 базы данных выглядит следующим образом (псевдокод)
CREATE TABLE Customer
CustomerID INT,
FirstName string,
Surname string,
AddressLine1 string,
AddressLine2 string,
AddressLine3 string,
AddressLine4 string
В версии 2 вы хотите, чтобы клиенты могли иметь более одного адреса, поэтому вы перемещаете поля адреса в новую таблицу:
CREATE TABLE Address
AddressID INT,
CustomerID INT,
AddressLine1 string,
AddressLine2 string,
AddressLine3 string,
AddressLine4 string
Вы перемещаете адреса из таблицы Customer в новую таблицу адресов следующим образом:
INSERT Address
CustomerID ,
AddressLine1 ,
AddressLine2 ,
AddressLine3 ,
AddressLine4
SELECT
*
FROM Customer
Затем вы удаляете избыточные поля адреса из Customer:
ALTER TABLE Customer
DROP COLUMNS
AddressLine1 ,
AddressLine2 ,
AddressLine3 ,
AddressLine4
Пока все хорошо. Но откуда мне знать, что новая таблица адресов содержит те же адреса, что и старая таблица клиентов. Весь процесс будет очень легко запускать и каким-либо образом шифровать адрес, чтобы клиенты эффективно меняли адреса друг друга. Код может пройти все тесты, но мы уничтожим данные наших клиентов, поскольку они больше не будут знать, где живут их клиенты.
Мы можем подтвердить перемещение полей адреса, запустив
Если при этом возвращаются какие-либо записи, обновление завершилось неудачно, поскольку некоторые клиенты не получили свой адрес:
SELECT
*
FROM
OldCustomerTable OCT LEFT JOIN Address A
ON OCT.CustomerID = A.CustomerID
WHERE
A.CustomerID IS NULL
Если при этом возвращается какая-либо запись, обновление не удалось, поскольку адреса были зашифрованы
SELECT
*
FROM
OldCustomerTable OCT INNER JOIN Address A
ON OCT.CustomerID = A.CustomerID
WHERE
OCT.Address1 != A.Address1
OR OCT.Address2 != A.Address2
OR OCT.Address3 != A.Address3
ИЛИ OCT.Address4! = A.Address4
Вы можете дополнительно проверить, что новая таблица адресов содержит только 1 адрес для каждого клиента
SELECT
CustomerID
, COUNT(AddressID)
FROM
Address
GROUP BY
CustomerID
HAVING
COUNT(AddressID) >1