PowerShell, ačkoli je známý pro svou flexibilitu, v sobě nese mnoho subtilních nuancí, které mohou být pro nového uživatele matoucí, zejména při práci se smyčkami a operátory. Tento článek se zaměřuje na konkrétní příklady použití smyček a porovnávacích operátorů, které výrazně zjednodušují zpracování dat ve skriptech a umožňují dosahovat lepších výsledků s menším množstvím kódu.

V PowerShellu je běžnou praxí používání operátoru pro potrubí, což znamená, že můžete snadno předávat objekty mezi jednotlivými příkazy, čímž se výrazně zjednodušuje kód a snižuje potřeba složitých smyček pro zpracování každého objektu individuálně. Například, pokud chcete filtrovat procesy na základě názvu, můžete použít příkaz:

powershell
$process = Get-Process | Where-Object { $_.ProcessName -like "*p*w*sh*" } $process

Tento příklad ukazuje, jak jednoduše můžete filtrovat seznam běžících procesů podle názvu, který odpovídá regulárnímu výrazu (wildcard). Tento způsob je nejen efektivní, ale i výrazně zkracuje kód, což by při použití tradičních smyček mohlo být daleko více složité a časově náročné.

Nicméně, pro složitější úkoly, kdy potřebujeme provést určité akce opakovaně, dokud není splněna nějaká podmínka, přicházejí na řadu smyčky. PowerShell podporuje několik typů smyček, jako jsou for, foreach a while. Smyčka for je ideální pro opakování určité akce specifikovaný početkrát, zatímco foreach je užitečná pro iterování přes každý prvek v poli. Smyčka while pokračuje v běhu, dokud je podmínka splněna, což ji činí ideální pro scénáře, kdy potřebujeme neustále opakovat určitou činnost, dokud není podmínka splněna.

Zde je příklad použití smyčky for pro zpracování souboru, kde se pokusíme číst obsah souboru několikrát v případě chyby:

powershell
for ($i=1; $i -le 3; $i++) { try { Get-Content c:\ExpertScripting.txt -ErrorAction Stop "Pokusaha " + $i + " uspela" break } catch { "Pokusaha " + $i + " selhala" Start-Sleep -s 30 } }

V tomto příkladu se skript pokusí přečíst soubor až třikrát, přičemž mezi pokusy čeká 30 sekund. Pokud čtení souboru selže, skript pokračuje opakováním akce, dokud neproběhne úspěšně. To je užitečné například při práci s nespolehlivými souborovými systémy nebo když očekáváme, že soubor bude k dispozici později.

Pro neomezené opakování akce lze použít smyčku while. Tento typ smyčky bude pokračovat do nekonečna, dokud se nesplní podmínka. Tento přístup je vhodný, když například čekáme na to, aby soubor byl napsán nebo dostupný před tím, než pokračujeme dál.

powershell
while ($true) { try { Get-Content c:\ExpertScripting.txt -ErrorAction Stop break } catch { Start-Sleep -s 30 } }

Kromě smyček se v PowerShellu často používají porovnávací operátory, které nám umožňují provádět různé kontroly nad hodnotami. Většina těchto operátorů je podobná těm, které známe z jiných jazyků, ale s několika důležitými rozdíly. Například operátor pro rovnost v PowerShellu není =, jak je běžné v mnoha jazycích, ale -eq. Tento detail je důležitý, protože pokud byste místo toho použili =, došlo by k nechtěnému přiřazení hodnoty místo porovnání.

Tabulka porovnávacích operátorů v PowerShellu je rozsáhlá a obsahuje jak standardní, tak i citlivé na velikost písmen varianty. Například operátor -like umožňuje používat zástupné znaky (wildcards), což je užitečné při hledání textových řetězců s určitou strukturou. Naopak -match vám umožní porovnávat hodnoty pomocí regulárních výrazů.

Je důležité mít na paměti, že některé operátory, jako je -contains, testují, zda hodnota existuje v kolekci, a mohou být velmi užitečné při práci s poli nebo seznamy. Například operátor -in umožňuje zjistit, zda se hodnota rovná jedné z hodnot uvedených v seznamu, což výrazně zjednodušuje podmínky v porovnání s tradičními smyčkami.

Pokud se tedy chcete vyhnout zbytečným smyčkám a optimalizovat svůj kód, měli byste vždy nejprve přemýšlet, zda nemůžete použít některý z těchto operátorů pro snadnou manipulaci s daty. Soubory, procesy nebo jiné objekty v PowerShellu je možné filtrovat, vybírat nebo zpracovávat pomocí jednoduchých filtrů a operátorů, které jsou výrazně efektivnější než jejich tradiční iterativní alternativy.

Co přesně dělá PowerShell DSC při opětovném spuštění konfigurace?

Při práci s PowerShell Desired State Configuration (DSC) je zásadní pochopit, jak se chová systém při opakovaném spuštění téže konfigurace. Tento proces není pouze o „spuštění skriptu znovu“, ale o cílené a inteligentní aplikaci požadovaného stavu. Klíčovou roli zde hraje LCM (Local Configuration Manager), který je zodpovědný za testování, vyhodnocení a případné aplikování změn.

V prvním průchodu konfigurací dochází k plnému vyhodnocení každého zdroje – tedy jednotlivých deklarací v DSC skriptu. Například, pokud je konfigurován adresář C:\CertificateBackups, DSC nejprve ověří jeho existenci (Test fáze). Pokud složka chybí, pokračuje nastavením (Set fáze) a pokusí se složku vytvořit. Je-li definována hodnota v registru, např. HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl\Win32PrioritySeparation s očekávanou hodnotou 24, DSC ověří skutečnou hodnotu v systému a nastaví ji, pokud se liší. V případě služby jako MSSQLSERVER je opět vyhodnocena aktuální situace: existuje-li služba, a pokud běží, změny jsou aplikovány jen v případě rozdílu mezi požadovaným a aktuálním stavem.

Zajímavý je rozdíl mezi prvním a druhým během konfigurace. V prvním běhu vidíme, že některé prostředky selhaly – například chybějící adresář vedl k pokusu o jeho vytvoření. Registr byl změněn, služba SQL Server byla spuštěna. V druhém průchodu se ale vše dramaticky zjednodušuje. LCM zjistí, že všechny prostředky odpovídají očekávanému stavu. Adresář již existuje, hodnota registru je správná, služba běží. DSC to vyhodnotí a přeskočí fázi Set, což potvrzují hlášení „Skip Set“. Výsledkem je výrazně kratší výstup a rychlejší průběh.

Tento mechanismus je základem idempotentnosti DSC – tedy schopnosti bez vedlejších efektů opakovaně aplikovat konfiguraci. Výsledkem je, že konfigurace může běžet například v plánovači úloh nebo jako součást CI/CD pipeline bez obav z negativního dopadu na běžící systém. Každé spuštění jednoduše ověří, zda je systém ve správném stavu, a pokud ne, provede pouze nezbytné úpravy.

Za zmínku stojí i způsob, jakým jsou jednotlivé prostředky vyhodnocovány. Vždy se začíná metodou Test, která vrací informaci o tom, zda je stav odpovídající. Následuje případná metoda Set, která stav upraví. To vše je řízeno LCM na základě instrukcí v MOF souboru, vygenerovaném z DSC konfigurace.

Pochopení tohoto procesu umožňuje návrh robustních, předvídatelných a opakovatelných konfiguračních scénářů. Administrátor se může spolehnout, že nedojde k nadbytečnému zásahu do systému, pokud již je vše nastaveno správně. Tato deterministická povaha DSC je zásadní zejména v prostředích, kde stabilita a opakovatelnost konfigurace mají prioritu.

Důležité je, že i když jednotlivé prostředky mohou být nastaveny z různých částí systému (adresáře, registr, služby), DSC se k nim staví jednotně: vše je vyhodnoceno a aplikováno dle deklarovaného stavu. LCM se tím stává centrálním vykonavatelem záměru definovaného administrátorem.

Je důležité si uvědomit, že LCM může pracovat v různých módech (např. ApplyOnly, ApplyAndMonitor, ApplyAndAutoCorrect), a tím se chování při opakovaných bězích může lišit. V našem případě šlo o standardní Apply módu – konfigurace je pouze aplikována, nikoliv monitorována nebo automaticky opravována při změnách.

DSC tedy nefunguje jako klasický skriptovací nástroj, ale jako systémová vrstva nad stavovým modelem, která v reálném čase rozhoduje, co je nutné udělat, a co nikoliv. Tato filozofie přináší do správy infrastruktury vyšší úroveň predikovatelnosti a integrity.

Jak automatizovat instalaci SQL Serveru pomocí příkazového řádku

Instalace SQL Serveru může být náročným procesem, který vyžaduje pečlivé nastavení různých parametrů. Automatizované instalace pomocí příkazového řádku (Command-Line Installation) usnadňují správu a konfiguraci SQL Serveru, zejména ve velkých prostředích nebo při nasazování více instancí. V tomto článku se podíváme na klíčové parametry a přístupy, které umožňují efektivní instalaci a správu SQL Serveru bez nutnosti manuálních zásahů.

Při instalaci SQL Serveru prostřednictvím příkazového řádku je kladeno důraz na použití různých parametrů, které určují specifické funkce a možnosti instalace. Parametr /IACCEPTSQLSERVERLICENSETERMS je nezbytný pro vyjádření souhlasu s licenčními podmínkami a nemá žádné další hodnoty, které by bylo nutné zadávat. Tento parametr je běžně součástí všech instalací a je nutný pro pokračování v procesu.

Dalším klíčovým parametrem je /ACTION, který určuje typ operace, kterou chcete vykonat. Nejčastěji se používá hodnota „Install“ pro instalaci nové instance SQL Serveru, ale tento parametr může mít také jiné hodnoty, například pro aktualizaci, opravu nebo odstranění instance. Mezi hodnoty, které tento parametr může nabývat, patří například „PrepareImage“, „Upgrade“, „Repair“, nebo „Uninstall“. Tento parametr je zásadní pro správnou konfiguraci procesu instalace.

Pokud se rozhodnete pro instalaci určitých funkcí SQL Serveru, použijete parametr /FEATURES. Tento parametr vyžaduje seznam funkcí, které budou součástí instalace, a může zahrnovat komponenty jako SQL Engine, Full Text, Replication, nebo PolyBase. Je důležité si uvědomit, že některé z těchto funkcí nejsou podporovány na Windows Server Core. Z tohoto důvodu je vždy nutné pečlivě zvážit, které funkce instalovat, aby nedošlo k nesprávnému nastavení systému.

Instalace na Windows Server Core přináší specifické výzvy, jelikož nelze použít grafické instalační nástroje. V tomto případě je nutné spustit instalaci v automatizovaném režimu pomocí parametru /qs, který zajistí, že instalace probíhá bez zásahu uživatele. Tato volba je užitečná zejména při správě serverů, které běží bez grafického rozhraní.

Pro pokročilé konfigurace může být užitečné specifikovat roli SQL Serveru během instalace pomocí parametru /ROLE. Tato možnost umožňuje instalovat SQL Server v předdefinovaných rolích, například jako součást farmy SharePoint nebo s využitím všech dostupných funkcí SQL Serveru. Nicméně použití role „AllFeatures_WithDefaults“ by mělo být omezeno na případy, kdy je opravdu nutné mít všechny funkce, protože to může zbytečně zvýšit nároky na výkon a bezpečnostní rizika.

Instalace SQL Serveru často vyžaduje zadání specifických informací o účtech služby. Parametry jako /SQLSVCACCOUNT a /SQLSVCPASSWORD určují účet a heslo pro spuštění služby databázového enginu. Pokud není použita gMSA (Group Managed Service Account) nebo virtuální účet, je nutné tyto parametry vyplnit. V případě, že se neprovádí explicitní nastavení těchto parametrů, budou služby běžet pod výchozím účtem.

Po dokončení instalace SQL Serveru je doporučeno provést rychlé kontrolní testy, nazývané „smoke tests“. Tyto testy slouží k ověření, že služby běží a že instance SQL Serveru je dostupná. Pomocí PowerShell cmdletu Get-Service lze ověřit stav jednotlivých služeb a ujistit se, že všechny služby byly správně nainstalovány a že jejich stav odpovídá očekávání. Takovéto testy jsou efektivní pro rychlou validaci po instalaci.

Další testování zahrnuje použití cmdletu Invoke-Sqlcmd, který umožňuje spustit T-SQL dotaz a ověřit, že SQL Server reaguje na příkazy. Tento test je klíčový pro ověření, že nově nainstalovaný server je plně funkční a připraven k použití.

Při automatizované instalaci SQL Serveru je vždy kladeno důraz na preciznost a správné zadání parametrů. I malá chyba může způsobit problémy s funkčností nebo výkonem celé databázové platformy. Z tohoto důvodu je důležité mít jasnou představu o tom, jaké komponenty a funkce potřebujete nainstalovat, a to jak z hlediska infrastruktury, tak i z pohledu požadavků na bezpečnost a výkonnost systému.

Před zahájením instalace je také dobré provést detailní plánování. To zahrnuje rozhodnutí o tom, zda je potřeba instalovat SQL Server jako samostatnou instanci nebo v rámci clusteru. Je také nutné zvážit požadavky na hardware a síťovou konfiguraci, zejména v prostředí s více servery nebo při použití vysoké dostupnosti. K tomu se přidává i potřeba správně nastavit autentizační mechanismy a zajistit, že SQL Server bude bezpečně komunikovat s ostatními komponentami v infrastruktuře.

Jak efektivně automatizovat údržbu SQL Serveru pomocí metadat

V moderním prostředí správy SQL Serveru je automatizace klíčovým nástrojem pro správce databází (DBA), kteří čelí výzvám spojeným s vysokým počtem instancí a komplexností administrativních úkolů. K efektivní automatizaci instalace a údržby je třeba využít různé přístupy, přičemž skriptování a nástroje pro správu konfigurace se ukazují jako nejefektivnější metody.

Existují různé způsoby, jak automatizovat instalaci SQL Serveru. Jednou z možností je skriptovaný přístup, který zahrnuje použití PowerShell skriptů pro spuštění instalačního programu setup.exe a následnou konfiguraci instance podle specifických požadavků. Tento přístup by měl zahrnovat i základní testy (tzv. "smoke tests"), které zajistí správnou instalaci instance. Alternativně můžeme využít přístup založený na správě konfigurace, který využívá nástroje jako PowerShell DSC k automatickému řízení instalace. Tento přístup je parametrizovatelný a zajišťuje, že instance bude vždy správně nasazena. Využití tohoto přístupu bude podrobněji rozebráno v kapitole o konfiguraci SQL Server instancí.

Důležitým krokem v automatizaci je práce s metadaty SQL Serveru. Metadata, která popisují jiná data, jsou pro automatizaci klíčová, protože umožňují vytvářet dynamické a inteligentní skripty. SQL Server poskytuje širokou škálu metadat, která zahrnují jak strukturální metadata (popisující objekty jako tabulky nebo databáze), tak deskriptivní metadata (popisující samotná data). Metadata jsou dostupná prostřednictvím různých katalogových pohledů, informačních schémat, dynamických pohledů pro správu a funkcí, a také systémových funkcí a uložených procedur.

V této kapitole se zaměříme na využití těchto metadat pro vytvoření inteligentních rutin pro údržbu SQL Serveru. Základními objekty, s nimiž by měl každý správce databáze být obeznámen, jsou například pohledy sys.tables nebo sys.databases. Tento text se však zaměří na méně známé objekty, které mohou výrazně pomoci při automatizaci údržby. Ačkoli by bylo možné věnovat každému jednotlivému metadata objektu několik kapitol, bude tato část knihy demonstrovat konkrétní příklady a využití metadat pro rutinní údržbu.

Prvním příkladem je využití metadat Query Store pro odstranění nepotřebných ad hoc dotazových plánů. Tyto plány mohou spotřebovávat paměť a jejich opakované používání bývá minimální. Využití metadat Query Store umožňuje vyhledat a odstranit takové plány, které nejsou používány, což vede k lepší efektivitě a výkonu systému. Skript na odstranění těchto plánů využívá pohledy sys.query_store_query_text a sys.query_store_query, které obsahují informace o dotazech a jejich plánech uložených v Query Store. Tento přístup je obzvláště užitečný pro zajištění optimálního výkonu, protože ad hoc plány, které jsou nepoužívané, mohou zbytečně zatěžovat paměť.

Dále, díky tomu, že metadata umožňují získat informace o prováděných dotazech a jejich výkonnostních charakteristikách, můžeme napsat inteligentní rutiny, které automaticky upraví parametry indexů nebo vynutí politiky, které nelze implementovat pomocí Policy-Based Management. Příklad skriptu uvedený v knize ukazuje, jak pomocí PowerShellu a Query Store metadata můžeme vykonávat dynamické SQL skripty proti všem databázím v instanci. Tento přístup umožňuje provádět údržbu napříč celým SQL Serverem a minimalizovat manuální zásahy, což zjednodušuje správu databázového prostředí.

Důležité je si uvědomit, že metadata jsou v SQL Serveru dostupná nejen pro vývoj a analýzu dat, ale i pro automatizaci údržby a konfigurace. To znamená, že správci databází by měli investovat čas do důkladného porozumění těmto metadatům, a to zejména v oblasti dynamického spravování výkonu a údržby instancí. K tomu může pomoci i hlubší studium dynamických pohledů pro správu a funkcí, které jsou podrobně popsány na MSDN. Pomocí těchto metadat lze napsat flexibilní skripty, které se automaticky přizpůsobí aktuálním podmínkám systému a zajistí tak jeho efektivní fungování s minimálním zásahem administrátora.

Základním principem automatizace údržby je tedy vysoce flexibilní přístup založený na metadatech. Tímto způsobem lze vytvořit dynamické a inteligentní údržbové rutiny, které nejen že ušetří čas, ale také zaručí lepší výkon a spolehlivost SQL Serveru v dlouhodobém horizontu.

Jak vytvořit hierarchické XML dokumenty v SQL pomocí FOR XML PATH, AUTO a RAW

Při práci s databázemi a požadavky na export dat do XML je velmi užitečné umět vytvářet XML dokumenty různých typů. SQL poskytuje několik nástrojů pro generování XML, mezi které patří FOR XML RAW, FOR XML AUTO a FOR XML PATH. Každý z těchto nástrojů umožňuje generovat XML, ale každý přístup má své specifické použití a charakteristiky. Pochopení těchto metod a jejich aplikace je klíčové pro efektivní práci s XML v SQL.

Prvním způsobem je FOR XML RAW, který vrací XML ve velmi jednoduché podobě. Tento režim je vhodný pro případy, kdy chcete získat jednoduchý seznam dat bez složité hierarchie. V každém řádku výsledku dotazu je vytvořen jeden XML prvek, a data jsou uložena v atributu tohoto prvku. Tento přístup je ideální pro jednoduché dokumenty, kde není potřeba vytvářet složitou strukturu. Například, když máme dotaz, který vrací informace o relacích v databázi, můžeme použít FOR XML RAW, abychom získali základní strukturu XML.

Pokud bychom se rozhodli použít více informativní název pro prvek, můžeme v dotazu použít volitelný argument, který umožňuje specifikovat název elementu. Například, místo generického názvu "row" bychom mohli použít název, který lépe vystihuje obsah, jako například "Session", což zlepší čitelnost a srozumitelnost výsledného XML dokumentu.

FOR XML AUTO přináší trochu více flexibility a je ideální pro případy, kdy potřebujeme automaticky zanořit data na základě spojení mezi tabulkami. Tento režim je uživatelsky přívětivější než RAW, protože automaticky generuje hierarchickou strukturu XML na základě typu spojení v dotazu. Tento režim je vhodný, když potřebujeme pracovat s více tabulkami, které mají vztahy mezi sebou, a chceme, aby výsledné XML bylo přehledně uspořádáno.

Příklad použití režimu AUTO ukazuje, jak SQL automaticky zanoří data podle spojení tabulek. Pokud bychom například používali tabulky sys.dm_exec_sessions a sys.dm_exec_requests, výsledný XML dokument by měl strukturu, kde každé spojení mezi tabulkami bude mít svou vlastní úroveň zanoření. Tento přístup je ideální pro jednoduché případy, kdy chcete mít dobře strukturovaný výstup bez nutnosti ručně definovat přesné umístění každého uzlu.

FOR XML PATH poskytuje největší flexibilitu a je nejvhodnější pro složitější XML dokumenty, kde chceme mít plnou kontrolu nad hierarchií a názvy prvků. Tento režim umožňuje specifikovat, jak každý sloupec v dotazu bude mapován na konkrétní prvek nebo atribut v XML dokumentu. Pokud použijeme symbol "@" před aliasem sloupce, tento sloupec bude mapován na atribut. Pokud symbol "@" nepoužijeme, sloupec se stane dětským prvkem.

Tento přístup umožňuje vytvářet složité a vysoce přizpůsobitelné struktury, kde například můžeme vytvořit uzel Session, který bude obsahovat atribut SessionID, a pod ním budou další uzly jako LoginName, HostName, nebo Status. Pokud máme složité vztahy mezi tabulkami, můžeme přidat další úroveň zanoření, což znamená, že např. tabulka Database bude mít svůj vlastní poduzel s názvem DatabaseName.

Při tvorbě XML dokumentu pomocí FOR XML PATH je třeba pečlivě zvážit pořadí sloupců v SELECT klauzuli, protože to určuje, jak budou data uspořádána v hierarchii. Pokud se rozhodneme pro složitější strukturu, je nutné definovat přesně, kde každý prvek nebo atribut bude umístěn v hierarchii XML. Tento přístup umožňuje vytvářet XML dokumenty, které jsou přizpůsobeny konkrétním potřebám aplikace a jsou ideální pro složité exporty dat nebo integraci s jinými systémy.

Pokud chceme například vytvořit XML dokument, kde každá relace bude obsahovat informace o databázi a příkazech, můžeme použít následující dotaz:

sql
SELECT ExecSessions.session_id, ExecSessions.login_name, ExecSessions.host_name, ExecSessions.status, ExecRequests.command, DB_NAME(ExecRequests.database_id) AS DatabaseName FROM sys.dm_exec_sessions ExecSessions INNER JOIN sys.dm_exec_requests ExecRequests ON ExecSessions.session_id = ExecRequests.session_id WHERE ExecSessions.is_user_process = 1 FOR XML PATH('UserSession'), ROOT('Sessions')

Tento dotaz vytvoří XML dokument, kde každý prvek UserSession bude obsahovat podprvky, jako jsou SessionID, LoginName, HostName a Status, a pod ním bude mít podprvek Database, který bude obsahovat název databáze.

Je důležité mít na paměti, že každý z těchto režimů má své specifické využití a že je třeba vybrat ten správný na základě potřeby výsledného XML dokumentu. Když chcete jednoduchý, plochý výstup, použijete FOR XML RAW. Pokud chcete automaticky generovanou hierarchii podle vztahů mezi tabulkami, použijete FOR XML AUTO. A pokud potřebujete plnou kontrolu nad strukturou a hierarchií XML, použijete FOR XML PATH.