Zmiana nazwy kolumny bez łamania aplikacji

2026-10-21 · 2 min

Zmiana nazwy kolumny bez łamania aplikacji

sp_rename jest szybkie.

Problem w tym, że wszystkie zależności nie stają się automatycznie zgodne z nową nazwą.

Ryzykowny wariant

1
2
3
4
EXEC sys.sp_rename
    N'dbo.Customer.Name',
    N'DisplayName',
    N'COLUMN';

Jeżeli stara aplikacja nadal odwołuje się do Name, przestaje działać natychmiast.

Wariant kompatybilny

Zamiast rename:

  1. dodaj nową kolumnę,
  2. utrzymuj zgodność obu wartości,
  3. przełącz kod,
  4. usuń starą kolumnę dopiero później.
1
2
ALTER TABLE dbo.Customer
ADD DisplayName nvarchar(200) NULL;

Backfill

1
2
3
UPDATE dbo.Customer
SET DisplayName = Name
WHERE DisplayName IS NULL;

Przy dużej tabeli wykonaj go partiami.

Okres przejściowy

W tym czasie można zastosować:

  • dual-write w aplikacji,
  • trigger jako rozwiązanie przejściowe,
  • procedurę aktualizującą oba pola,
  • widok zgodności.

Trigger bywa wygodny, ale zwiększa ukrytą logikę i powinien mieć jasno określony termin usunięcia.

Jak znaleźć zależności?

1
2
3
4
5
SELECT
    OBJECT_SCHEMA_NAME(referencing_id) AS SchemaName,
    OBJECT_NAME(referencing_id) AS ObjectName
FROM sys.sql_expression_dependencies
WHERE referenced_id = OBJECT_ID(N'dbo.Customer');

To nie wykryje wszystkiego, np. dynamicznego SQL poza bazą.

Potrzebne są też telemetryka i analiza aplikacji.

Ostateczne usunięcie

Stara kolumna może zostać usunięta dopiero wtedy, gdy:

  • stary kod nie działa już w żadnej instancji,
  • nie ma raportów ani integracji używających starej nazwy,
  • monitoring nie pokazuje odwołań,
  • rollback nie wymaga starego kontraktu.

Podsumowanie

Rename jest operacją techniczną. Migracja nazwy jest zmianą kontraktu.

W Relacyjnym Renesansie kontrakty zmieniamy etapami.


Tagi: SQL Server , schema evolution , compatibility , deployment , database DevOps

Marcin Pytlik
LinkedIn · GitHub

Marcin Pytlik

LinkedIn · GitHub