Projekt

Všeobecné

Profil

Nastavenie databázy pri vývoji (appsettings.json + set-database)

Čo sa zmenilo

Pôvodný spôsob nastavovania databázy pre vývoj cez config.xml / config.template.xml a spúšťanie cez bootstrap.cmd bol zrušený. Namiesto neho sa databáza pre lokálny vývoj nastavuje cez súbory appsettings.json a appsettings.Override.json v koreňovom priečinku solution (root folder).

Tieto zmeny sa týkajú iba nášho lokálneho spúšťania Previsu pri vývoji. Zákazníka sa priamo nedotýkajú — ten si databázu zadáva pri prihlásení (login). Výnimkou je zmena v PrevisAPI, viď sekcia „Dôsledok pre deployment u zákazníka".

Ako to funguje

O databáze pri vývoji rozhodujú dva súbory v roote solution:

Súbor Význam
appsettings.json Východzie (default) nastavenie. Je verzovaný v gite. Obsahuje predvolenú databázu testDBbvs_dev.
appsettings.Override.json Voliteľný lokálny override. Nie je verzovaný v gite (je v .gitignore). Ak existuje, jeho hodnoty prepíšu hodnoty z appsettings.json.

Výsledné nastavenie = appsettings.json, na ktoré sa „navrch" aplikuje appsettings.Override.json (ak existuje). Vďaka tomu si každý vývojár môže lokálne prepnúť databázu bez toho, aby zasiahol do verzovaného appsettings.json.

Východzí obsah appsettings.json:

{ "DbConnection": { "Server": "localhost", "Database": "testDBbvs_dev", "PoolSize": 1000 } } 

Príklad appsettings.Override.json (prepne iba databázu, zvyšok zostáva z appsettings.json):
{ "DbConnection": { "Database": "mojaInaDB" } } 

h2. Prepnutie databázy cez set-database

V priečinku cmd sú pripravené skripty set-database.cmd a set-database.ps1. set-database.cmd je len obal, ktorý spustí set-database.ps1 cez PowerShell. Skript zapisuje/maže súbor appsettings.Override.json v roote solution.

Skript zároveň prepíše connection string v PrevisDS/app.config tak, aby zodpovedal výslednej databáze (viď sekcia „Ako to číta PrevisDS"). Vďaka tomu jeden príkaz nastaví databázu pre všetko naraz.

Použitie

Príkaz Čo spraví
set-database.cmd testDBbvs_dev Vytvorí/prepíše appsettings.Override.json a nastaví Database na testDBbvs_dev
set-database.cmd mojaInaDB Nastaví databázu na mojaInaDB
set-database.cmd (bez parametra) Zmaže appsettings.Override.json → vráti sa späť na default z appsettings.json
set-database.cmd -Help Zobrazí nápovedu

Príklad pracovného postupu

Chcem pracovať nad inou databázou: spustím set-database.cmd testDBbvs_test.
Vytvorí sa appsettings.Override.json s "Database": "testDBbvs_test".
Spustím Previs / PrevisAPI v DEBUG — obe použijú testDBbvs_test.
Keď sa chcem vrátiť na default, spustím set-database.cmd bez parametra → override súbor sa zmaže.

Ako to číta Previs

Previs číta nastavenie metódou AppSettings.ReadDbConnection(), ktorá:

nastaví base path na root solution,
načíta appsettings.json,
voliteľne načíta appsettings.Override.json (ak existuje), čím prepíše hodnoty,
vráti sekciu DbConnection.
Toto sa používa iba pri vývoji. Zákazník si databázu naďalej vyberá pri prihlásení.

Ako to číta PrevisAPI

PrevisAPI má vlastný appsettings.json (vo svojom priečinku aplikácie). V jeho sekcii DbConnection sú pri Server a Database zámerne placeholdery typu "comes from root appsettings" — tie sa pri vývoji prepíšu.

Pri štarte (Global.asax.cs) PrevisAPI:

načíta svoj vlastný appsettings.json,
iba v DEBUG buildoch: navrch primerguje root appsettings.json a následne root appsettings.Override.json (ak existujú).
Vďaka tomu pri vývoji PrevisAPI použije rovnakú databázu ako Previs — tú, ktorú určuje root appsettings.json / appsettings.Override.json. Predtým Previs po prihlásení posielal PrevisAPI, akú databázu má použiť, čo nebolo ideálne.

Mergovanie root nastavení a appsettings.Override.json prebieha len v DEBUG. V Release builde PrevisAPI číta iba svoj vlastný appsettings.json.

Ako to číta PrevisDS

Projekt PrevisDS (typované datasety) má vlastný connection string v súbore PrevisDS/app.config (kľúč PrevisDS.Properties.Settings.trusted). Tento súbor je v .gitignore (je per-vývojár, neverzuje sa). Skript set-database doň pri každom prepnutí zapíše connection string podľa výslednej databázy (appsettings.json + appsettings.Override.json), v tvare Data Source=...;Initial Catalog=...;Integrated Security=True;Encrypt=false.

Tento connection string slúži iba pre design-time — t. j. návrhár typovaných datasetov vo Visual Studiu (Preview Data, konfigurácia/regenerácia XSD a queries). Za behu Previsu sa nepoužije — spojenie každého TableAdaptera sa po prihlásení vždy prepíše na to z App.Data (LibData.dsInit / TableAdapter.Init(this.Connection)). Zákazníka sa to teda netýka.

Súbory PrevisDS/Properties/Settings.settings a PrevisDS/Properties/Settings.Designer.cs skript zámerne nemení. Settings.Designer.cs je vygenerovaná trieda, ktorú používajú všetky TableAdaptery, a je súčasťou kompilácie (generuje ju len Visual Studio, nie príkazový/CI build) — preto musí zostať verzovaná a nedá sa dať do .gitignore. Hodnota databázy v nej je len nepoužitý fallback, takže ju netreba prepisovať.

Ako to číta PrevisDSGenerator

Generátor typovaných datasetov (PrevisDSGenerator) berie databázu rovnako cez AppSettings.ReadDbConnection() (root appsettings.json + appsettings.Override.json) vo svojej triede DataAccessConfig. Jeho vlastný App.config neobsahuje žiadny connection string. Žiadne ďalšie nastavenie netreba.

Dôsledok pre deployment u zákazníka

⚠️ Zmena v PrevisAPI sa dotýka aj zákazníka — v Release builde PrevisAPI berie databázu zo svojho vlastného appsettings.json, nie z toho, čo mu po prihlásení povie Previs.

Pri deploymente treba zohľadniť:
appsettings.json v PrevisAPI je v .csproj označený ako ExcludeFilesFromDeployment → pri nasadení sa neprepíše existujúci súbor na serveri zákazníka.
Treba sa uistiť, že appsettings.json na zákazníckom serveri má správne nastavenú DbConnection (Server + Database), keďže placeholder hodnoty "comes from root appsettings" sa v Release nikým neprepíšu.

Zmeny v PrevisDS a PrevisDSGenerator sa zákazníka netýkajú — sú čisto vývojárske (design-time, resp. generovanie datasetov).

Súvisiace súbory

appsettings.json (root) — východzie nastavenie DB pre vývoj
appsettings.Override.json (root, git-ignored) — lokálny override DB
set-database.cmd / set-database.ps1 — prepínanie databázy (zapisuje override + PrevisDS/app.config)
PrevisDS/app.config (git-ignored) — connection string pre design-time návrhár typovaných datasetov
AppSettings.cs — čítanie nastavenia v Previse (a v PrevisDSGenerator)
Global.asax.cs — čítanie + merge nastavenia v PrevisAPI

DbRestore — obnovenie vývojovej databázy zo zálohy

DbRestore je konzolový nástroj (FromPrevisWeb/DbRestore), ktorý obnoví vývojovú databázu zo zálohy (.bak / .bkp), pripraví ju na prácu (DB užívatelia, roly, práva, šifrovacie kľúče, vývojové nastavenia) a na záver spustí code generation. Je to náhrada za pôvodný RestoreTool — robí to isté, len bez GUI.

DbRestore obnovuje do tej istej databázy, ktorú používa Previs pri vývoji — cieľový názov sa berie z root appsettings.json (resp. appsettings.Override.json), rovnako ako pre Previs/PrevisAPI. Viď sekcia „Nastavenie databázy pri vývoji".

Predpoklady

  • Bežiaci SQL Server na localhost (Windows auth, prihlásený užívateľ musí byť sysadmin).
  • Súbor so zálohou na disku (cesta v BackupPath).
  • Cieľová databáza nesmie existovať (viď sekcia „Existujúca databáza").
  • Spúšťať v DEBUG builde (merge root nastavení prebieha len v DEBUG).

Nastavenie

DbRestore má vlastný appsettings.json (FromPrevisWeb/DbRestore/appsettings.json) s nastaveniami špecifickými pre restore. Server a Database sú placeholdery — preberajú sa z root appsettings.json (rovnako ako v PrevisAPI).

{
  "DbConnection": {
    "Server": "comes from root appsettings",
    "Database": "comes from root appsettings",
    "PoolSize": 1000,
    "BackupPath": "d:\\SQL\\BKP\\testDBbvs.bkp",
    "DataPath": "d:\\SQL\\DATA" 
  }
}
Nastavenie Význam
BackupPath Cesta k zálohe (.bak/.bkp), z ktorej sa obnovuje. Podporuje aj .gz (rozbalí sa automaticky).
DataPath Priečinok, kam sa uložia .mdf/.ldf súbory obnovenej databázy (default d:\SQL\DATA).
Server, Database Placeholdery — preberajú sa z root appsettings.json (cieľová DB = tá, ktorú používa Previs, default testDBbvs_dev).

Ako spustiť

Z Visual Studia: nastav DbRestore ako startup projekt a spusti v Debug (F5).

Alebo z príkazového riadku (z root solution):


dotnet run --project FromPrevisWeb\DbRestore\DbRestore.csproj

Priebeh sa vypisuje do konzoly (DbRestore: server=…, database=…, backup=…DbRestore: hotovo.).

Čo DbRestore spraví

  1. Vytvorí SQL server logins (bsoft, bsoft_user, bsoft_tester), ak ešte neexistujú.
  2. Skontroluje, či cieľová databáza existuje — ak áno, skončí výnimkou (nič neprepíše).
  3. Obnoví zálohu ako cieľovú databázu. .mdf/.ldf idú do DataPath s časovou pečiatkou v názve súboru (aby sa opakované restory na disku neprepisovali).
  4. Ak vedľa zálohy existuje .sql súbor s rovnakým názvom, spustí ho (post-restore skript).
  5. Vytvorí DB užívateľov, roly a práva (bsoft, bsoft_tester, bsoft_user, prihlásený Windows užívateľ).
  6. Nastaví šifrovanie — vytvorí, resp. rotuje symetrický kľúč a certifikát (PrevisSymmetricKey / PrevisEncryptionCertificate) pre tento server.
  7. Vyresetuje vývojové nastavenia (cesty, e-maily, API adresy…) v UserSettings / Firma.
  8. Zapíše aktuálny git commit do Firma.CommitHash.
  9. Spustí code generation (CodeGeneration.Runner) — aplikuje čakajúce SQL/C# skripty schémy a pregeneruje kód.

Existujúca databáza

DbRestore zámerne nedropuje existujúcu databázu. Ak cieľová DB (napr. testDBbvs_dev) už existuje, nástroj skončí výnimkou typu:

Databaza 'testDBbvs_dev' uz existuje. Pred restore ju manualne dropni.

Je to poistka, aby si si omylom neprepísal databázu, na ktorej práve pracuješ. Keď si istý, drop sprav sám (SSMS alebo SQL DROP DATABASE) a spusti DbRestore znova.

Ako DbRestore číta nastavenie

Rovnako ako PrevisAPI: načíta svoj vlastný appsettings.json (BackupPath, DataPath) a v DEBUG navrch primerguje root appsettings.json a root appsettings.Override.json (ak existujú). Vďaka tomu cieľová databáza = tá istá, ktorú určuje root appsettings.json / set-database pre Previs.

Merge root nastavení prebieha len v DEBUG. Preto DbRestore spúšťaj v DEBUG builde.

Súvisiace súbory

FromPrevisWeb/DbRestore/appsettings.json — nastavenie zálohy a cieľa (BackupPath, DataPath)
FromPrevisWeb/DbRestore/Program.cs — vstupný bod a poradie krokov
FromPrevisWeb/DbRestore/DbRestorer.cs — samotný restore (+ gzip, post-restore .sql)
FromPrevisWeb/DbRestore/DbAccessSetup.cs — server logins, roly/práva, šifrovanie, reset nastavení