NOT NULL bez przestoju: jak bezpiecznie dodać obowiązkową kolumnę
NOT NULL bez przestoju: jak bezpiecznie dodać obowiązkową kolumnę
Pozornie prosta zmiana:
| |
na dużej tabeli może być wszystkim, tylko nie prostą zmianą.
Bezpieczniej rozbić ją na kilka etapów.
Etap 1 — kolumna nullable
| |
Stary kod nadal działa, bo nie musi jeszcze znać nowej kolumny.
Etap 2 — nowy kod zapisuje wartość
Od tego momentu wszystkie nowe rekordy powinny mieć SourceSystem.
Można monitorować naruszenia:
| |
Etap 3 — backfill
Uzupełniamy stare dane partiami.
| |
Rozmiar partii powinien wynikać z obserwacji logu, blokad i czasu wykonania.
Etap 4 — walidacja
| |
Zero to dopiero początek. Trzeba jeszcze potwierdzić, że wszystkie aktywne wersje aplikacji zapisują wartość.
Etap 5 — NOT NULL
| |
To powinien być osobny krok wdrożenia.
A co z DEFAULT?
Default może pomóc dla nowych rekordów:
| |
Nie powinien jednak maskować błędu aplikacji bez świadomej decyzji.
Najważniejsza zasada
Najpierw spraw, żeby ograniczenie było prawdą biznesową i faktyczną, a dopiero później wymuś je technicznie.
Podsumowanie
Zmiana NULL -> NOT NULL nie musi być jednym poleceniem.
Expand, zapis nowej wartości, backfill, walidacja i dopiero constraint — to dużo spokojniejsza droga.