Printer icon

Nota techniczna z dn. 08-12-2025

Ważne zmiany w mechanizmie migracji zmiennych aplikacji (wersja 1.15.2)

opracował: Jacek Mucha

Kontekst zmiany

W wersji 1.15.2 wprowadzono integrację z OpenBao do bezpiecznego przechowywania sekretów. Wymusiło to zmianę struktury bazy danych (nowa tabela systemowa) oraz aktualizację logiki migracji zmiennych aplikacyjnych.

Na czym polega zmiana?

Zmieniono sposób identyfikacji zmiennych aplikacyjnych podczas migracji:

  • Dawniej: Identyfikacja po kluczu złożonym (Kod aplikacji + Kod zmiennej).
  • Obecnie: Identyfikacja po atrybucie RowGUID (analogicznie do innych obiektów systemu).

Ryzyko i konsekwencje

Ponieważ atrybut RowGUID w zakresie zmiennych aplikacyjnych został dodany do platformy później niż same zmienne aplikacyjne, jego wartości mogą różnić się pomiędzy środowiskami (np. deweloperskim a produkcyjnym). Wobec tego mogą wystąpić dwa przypadki:

  • Migracja pełna (eksport zmiennych ze wszystkimi ich wartościami): system zadziała poprawnie, czyli nadpisze wartości zmiennej aplikacyjnej dla każdego środowiska (dev, test, prod) w środowisku docelowym.
  • Migracja częściowa (eksport zmiennych bez wartości dla środowiska docelowego): Istnieje ryzyko nadpisania wartości środowiska docelowego przez NULL, ponieważ ze względu na różnicę w RowGUID mechanizm migracji potraktuje istniejącą zmienną na środowisku docelowym jako obiekt do usunięcia. Nową zmienną (importowaną bez wartości) wstawi w jej miejsce, więc jeżeli nie dostarczy się zmiennej z kompletem wartości, to dla brakujących wartości system ustawi NULL.

Zalecane działania

Aby uniknąć utraty danych należy przed migracją ujednolicić wartości RowGUID w środowisku docelowym i źródłowym. Modyfikację należy wykonać dla tabel: [core].[EnvironmentVariables] oraz [core].[EnvironmentVariableValues].

Aby to zrobić można wykonać poniższe kroki w celu spreparowania w środowisku źródłowym zapytań SQL UPDATE dla powyższych tabel i wkleić gotowe zapytania do skryptu przed importem aplikacji. Przy wykorzystaniu funkcjonalności skryptu przed importem aplikacji wygenerowany skrypt zostanie wykonany automatycznie w środowisku docelowym na każdej bazie danych i wyrówna wartości RowGUID zmiennych aplikacji.

Generowane przykładowego skryptu

  1. W AdminSPA w Kreatorze modeli danych otworzyć okno zapytania SQL i wywołać poniższe zapytanie, które wygeneruje listę poleceń UPDATE do wykonania w środowisku docelowym:
    SELECT
    'UPDATE [core].[EnvironmentVariables] ' +
    'SET RowGuid = ''' + CAST(ev.RowGuid AS NVARCHAR(36)) + ''' ' +
    'WHERE Code = ''' + REPLACE(ev.Code, '''', '''''') + ''' ' +
    'AND ApplicationDefinitionId = ( ' +
    'SELECT Id FROM core.ApplicationDefinitions ' +
    'WHERE RowGuid = ''' + CAST(ad.RowGuid AS NVARCHAR(36)) + '''' +
    ');' as 'UPDATE QUERY'
    FROM [core].[EnvironmentVariables] ev
    JOIN [core].[ApplicationDefinitions] ad ON ad.Id = ev.ApplicationDefinitionId;
    

    wynikiem będzie zestaw poleceń SQL UPDATE dla tabeli [core].[EnvironmentVariables] do uruchomienia w środowisku docelowym:

    Wynik zapytania otrzymany z poziomu AdminSPA
    Wynik zapytania otrzymany z poziomu AdminSPA
  2. Utworzoną listę poleceń UPDATE można skopiować i wstawić skryptu przed migracją aplikacji lub wywołać ręcznie w środowisku docelowym.

  3. Do skryptu przed migracją aplikacji dodać po liście poleceń UPDATE poniższy kod lub wywołać go ręcznie w środowisku docelowym jako drugi:

    UPDATE evv
    SET evv.RowGuid = ev.RowGuid
    FROM [core].[EnvironmentVariableValues] evv
    INNER JOIN [core].[EnvironmentVariables] ev ON ev.Id = evv.EnvironmentVariableId
    WHERE evv.RowGuid != ev.RowGuid
    
  4. Całość kodu SQL w skrypcie przed migracją aplikacji powinna być następująca (przykład):

    UPDATE [core].[EnvironmentVariables] SET RowGuid = 'C8183D5E-56FC-43F2-A128-CE056B01C1BE'
    WHERE Code = 'KodZmiennej1' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '1CF44416-220C-43D2-848B-2C3AF55DB1A9');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = 'FECA71BD-2FBB-4170-ABFB-04571D9E29C9'
    WHERE Code = 'KodZmiennej2' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '970FCF42-488B-47E9-AE28-3FDAD58A4CA6');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = '1C54C094-8482-4A49-8C33-DC8001B6A099'
    WHERE Code = 'KodZmiennej3' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '1CF44416-220C-43D2-848B-2C3AF55DB1A9');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = 'B21E675C-08A4-469C-96A5-1756115D58C8'
    WHERE Code = 'KodZmiennej4' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '1CF44416-220C-43D2-848B-2C3AF55DB1A9');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = 'D8F863C0-9BEE-4520-BC8F-2FBCBD46318D'
    WHERE Code = 'KodZmiennej5' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '970FCF42-488B-47E9-AE28-3FDAD58A4CA6');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = 'F0CBE7E4-077A-48A9-8B21-D3EF5D0764DF'
    WHERE Code = 'KodZmiennej6' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = '1CF44416-220C-43D2-848B-2C3AF55DB1A9');
    UPDATE [core].[EnvironmentVariables] SET RowGuid = '0470FA3D-E5C7-4936-B885-A5EFAF33E7C0'
    WHERE Code = 'KodZmiennej7' AND ApplicationDefinitionId =
    ( SELECT Id FROM core.ApplicationDefinitions WHERE RowGuid = 'E125AFF3-3046-4E65-96F3-7C25E76BD40A');
        
    (...)
       
    UPDATE evv
    SET evv.RowGuid = ev.RowGuid
    FROM [core].[EnvironmentVariableValues] evv
    INNER JOIN [core].[EnvironmentVariables] ev ON ev.Id = evv.EnvironmentVariableId
    WHERE evv.RowGuid != ev.RowGuid
    
  5. Po wykonaniu powyższych czynności wartości parametrów RowGUID będą ujednolicone w środowisku źródłowym i docelowym.



Copyright © 2025 OPTEAM SA. Theme Copyright © 2017-2020 Patrick Marsceill. Distributed by an MIT license.