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.configtak, 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.jsonprebieha 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
PrevisDSaPrevisDSGeneratorsa 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ývojappsettings.Override.json (root, git-ignored) — lokálny override DBset-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 datasetovAppSettings.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í¶
- Vytvorí SQL server logins (
bsoft,bsoft_user,bsoft_tester), ak ešte neexistujú. - Skontroluje, či cieľová databáza existuje — ak áno, skončí výnimkou (nič neprepíše).
- Obnoví zálohu ako cieľovú databázu.
.mdf/.ldfidú doDataPaths časovou pečiatkou v názve súboru (aby sa opakované restory na disku neprepisovali). - Ak vedľa zálohy existuje
.sqlsúbor s rovnakým názvom, spustí ho (post-restore skript). - Vytvorí DB užívateľov, roly a práva (
bsoft,bsoft_tester,bsoft_user, prihlásený Windows užívateľ). - Nastaví šifrovanie — vytvorí, resp. rotuje symetrický kľúč a certifikát (
PrevisSymmetricKey/PrevisEncryptionCertificate) pre tento server. - Vyresetuje vývojové nastavenia (cesty, e-maily, API adresy…) v
UserSettings/Firma. - Zapíše aktuálny git commit do
Firma.CommitHash. - 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 krokovFromPrevisWeb/DbRestore/DbRestorer.cs — samotný restore (+ gzip, post-restore .sql)FromPrevisWeb/DbRestore/DbAccessSetup.cs — server logins, roly/práva, šifrovanie, reset nastavení