Wijziging van het tabelschema is relevant geworden met de massale verspreiding van Agile-methodologieën. Projecten evolueren, eisen veranderen — na verloop van tijd ontstaat er vaak de noodzaak om kolommen toe te voegen/wijzigen/verwijderen. Dergelijke wijzigingen zijn bijzonder riskant in actieve productiedatabases.
De wijziging van de structuur kan leiden tot:
Veranderingen in grote tabellen (miljoenen rijen) die actief door andere services worden gebruikt, zijn bijzonder complex.
Slim omgaan met ALTER TABLE — gefaseerde wijzigingen, het maken van een kopie van gegevens, testen op een testomgeving, beperken van de downtime. Het gebruik van transacties, gefaseerde migratie en back-ups voor grote wijzigingen. In hoogbelaste DBMS worden vaak "online"-algoritmen voor ALTER gebruikt.
Voorbeeldcode:
-- Een nieuwe kolom toevoegen met een standaardwaarde ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new'; -- Geleidelijk vullen van nieuwe kolommen UPDATE orders SET status = CASE WHEN shipped_at IS NOT NULL THEN 'shipped' ELSE 'pending' END;
Belangrijke kenmerken:
Wordt ALTER TABLE atomair uitgevoerd?
Meestal niet: het wijzigen van een tabel kan veel tijd in beslag nemen. In geval van een storing kan een deel van de wijzigingen worden teruggedraaid, maar een deel kan blijven hangen. Daarom wordt transactionele bescherming op DDL-commando's slechts door enkele DBMS geïmplementeerd (bijvoorbeeld PostgreSQL).
Is het pijnloos om het type van een kolom te veranderen van INTEGER naar VARCHAR?
Niet altijd: als er oude gegevens in de kolom zijn die niet overeenkomen met het nieuwe formaat, of gerelateerde objecten (indexen, triggers, sleutels), kan de DBMS weigeren het type te wijzigen of kunnen de gegevens beschadigd raken.
Legt ALTER TABLE altijd een exclusieve vergrendeling op de hele tabel?
Het hangt af van de DBMS: in MySQL en oudere versies van SQL Server blokkeert elke ALTER-bewerking vaak de hele tabel totdat deze is voltooid, maar moderne DBMS ondersteunen "online DDL", waardoor de vergrendeltijd wordt verminderd.
Een DevOps-engineer voerde massale wijzigingen door in drie belangrijke tabellen via ALTER TABLE en verwijderde oude kolommen. Hij hield er geen rekening mee dat deze kolommen gekoppelde externe sleutels en triggers hadden. Tijdens het uitvoeren van ALTER was de database 20 minuten in gebruik — in die tijd "vielen" de services uit door het ontbreken van de benodigde velden.
Voordelen:
Nadelen:
Een analist plande de toevoeging van een kolom in verschillende fasen: eerst werd een kolom met een standaard ingesteld, waarna testbelasting op de kopieën werd uitgevoerd, en pas daarna vond de echte ALTER 's nachts plaats waarbij alle ontwikkelaars werden geïnformeerd over het aanstaande migratiewindow.
Voordelen:
Nadelen: