Zmiana schematu tabeli stała się aktualna ze względu na masowe wprowadzenie metodyk Agile. Projekty ewoluują, wymagania się zmieniają — w miarę upływu czasu pojawia się konieczność dodawania/modyfikowania/usuwania kolumn. W działających bazach produkcyjnych takie zmiany są szczególnie ryzykowne.
Modyfikacja struktury może prowadzić do:
Zmiany są szczególnie trudne w dużych tabelach (miliony wierszy), które są aktywnie używane przez inne usługi.
Umiejętne zarządzanie poprzez ALTER TABLE — stopniowe zmiany, tworzenie kopii danych, testowanie na środowisku testowym, ograniczenie czasu przestoju. Wykorzystanie transakcji, stopniowa migracja i tworzenie kopii zapasowych przed dużymi zmianami. W wysoko obciążonych DBMS często korzysta się z "online"-algorytmów ALTER.
Przykład kodu:
-- Dodanie nowej kolumny z domyślną wartością ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new'; -- Stopniowe wypełnianie nowych kolumn UPDATE orders SET status = CASE WHEN shipped_at IS NOT NULL THEN 'shipped' ELSE 'pending' END;
Kluczowe cechy:
Czy ALTER TABLE jest wykonywane atomowo?
Najczęściej nie: zmiana tabeli może zająć dużo czasu. W przypadku awarii część zmian może zostać wycofana, ale część może „utknąć”. Dlatego ochrona transakcyjna dla poleceń DDL jest realizowana tylko w niektórych DBMS (np. PostgreSQL).
Czy można bezboleśnie zmieniać typ kolumny z INTEGER na VARCHAR?
Nie zawsze: jeśli w kolumnie są stare dane, które nie odpowiadają nowemu formatowi, lub powiązane obiekty (indeksy, wyzwalacze, klucze), DBMS może nie zezwolić na zmianę typu lub dane mogą zostać uszkodzone.
Czy ALTER TABLE zawsze nakłada wyłączną blokadę na całą tabelę?
Zależy od DBMS: w MySQL i starszych wersjach SQL Server jakakolwiek operacja ALTER często całkowicie blokuje tabelę do zakończenia, ale nowoczesne DBMS obsługują "online DDL", co skraca czas blokady.
Inżynier DevOps wprowadził masowe zmiany w trzech ważnych tabelach przez ALTER TABLE i usunął stare kolumny. Nie uwzględnił, że te kolumny miały powiązane klucze obce i wyzwalacze. W czasie wykonywania ALTER baza była zablokowana przez 20 minut — w tym czasie usługi „padły” z powodu braku potrzebnych pól.
Zalety:
Wady:
Analityk zaplanował dodanie kolumny w kilku etapach: najpierw utworzono kolumnę z domyślną wartością, a następnie załadowano testowe obciążenie na kopiesię, dopiero potem dokonano rzeczywistego ALTER w nocy i poinformowano wszystkich programistów o nadchodzącym oknie migracyjnym.
Zalety:
Wady: