Záplatování pro SQL procedury, funkce a triggery

PříspěvekNapsal: 30.01.2019 11:25
od jan.zocek
Záplatování pro SQL procedury, funkce a triggery
V rámci lednové (2019) verze byla uvolněna funkcionalita, která umožňuje záplatovat SQL procedury, funkce a triggery, aniž by uživatel musel spouštět každý den HELIOS pomocí HQL skriptu.

Nová tabulka
V systémové (nulté) databázi je nově tabulka TabHeliosPatches, do které se nainsertuje opravená verze dané procedury, funkce či triggeru. HELIOS pak při kontrole konzistence (probíhá každý den při prvním spuštění HELIOSu) nahradí definici zalinkovanou natvrdo do programu tou, která bude ve výše uvedené tabulce, a pak teprve provede porovnání vůči databázi. Toto zafunguje i při tvorbě nové databáze.

Tabulka obsahuje sloupce Verze, Popis a Skript. Verze je verze programu, pro kterou je daný skript platný. Skripty pro jinou verzi se neberou v potaz, neuplatní se. Popis je jakýkoliv popisný text, není nijak vyžadován.

Skript obsahuje vlastní CREATE skript pro danou proceduru, funkci či trigger. MUSÍ začínat (bez mezer) CREATE PROC nebo CREATE FUNCTION nebo CREATE TRIGGER. Jiné texty se neuplatní.

Tabulka může obsahovat více skriptů pro danou verzi a daný SQL objekt, při kontrole konzistence se ale uplatní pouze ten poslední (tříděno podle ID).

Přehled opravných skriptů je možno zobrazit akcí Záplaty nad přehledem databází v systémové konfiguraci.

Sloupce tabulky TabHeliosPatches:
Popis NVARCHAR(255) - libovolný popis, může být prázdný
Verze NVARCHAR(12) - verze programu (např. 030020180979)
Skript NTEXT - vlastní skript

POZOR!
U skriptu pro tvorbu triggeru se nesmí použít prefix dbo. před názvem triggeru či tabulky!! Správně: CREATE TRIGGER ht_..... ON Tab... FOR

Skript s úpravou
Pro zjednodušení zápisu skriptu do databáze je připravena uložená procedura dbo.hp_AplikujZaplatu s parametry @Verze NVARCHAR(12), @Popis NVARCHAR(255), @Skript NVARCHAR(MAX). Stačí vytvořit HQL skript, který zavolá tuto proceduru a spustit ho nejlépe v systémové (nulté) databázi.

Např. EXEC dbo.hp_AplikujZaplatu N'030020181200', N'muj popis - neni povinny', N'CREATE PROC dbo.hp_............'
Uložená procedura provede následující:
* zapíše skript do tabulky TabHeliosPatches v systémové databázi
* projde všechny online databáze dané instalace a provede
** pokud sedí verze DB a programu, tak ALTER (procedury, funkce nebo triggeru)
** zapíše do TabHeliosPatches, pokud tato existuje
Toto snižuje časovou náročnost aplikování úpravy hlavně u vícedatových instalací.
Zapisování uvozovek do těla procedury při její tvorbě musí být zdvojené:
* tvorba procedury = N'CREATE PROC ... ''text v uvozovkách'' pokračování procedury'
* vzniklá procedura = CREATE PROC ... 'text v uvozovkách' pokračování procedury

Případné problémy
Pokud se jedná např. o účetní firmu, kde některé databáze jsou systémovými databázemi jiných licencí HELIOSu, může dojít k nekonzistenci úpravy v případě, že je umožněn přístup nové licenci po aplikování úpravy.

Nová licence si totiž vytvoří svoji tabulku TabHeliosPatches, která ale neobsahuje danou úpravu a ta se tak při kontrole konzistence neuplatní a provede se návrat na původní verzi upraveného objektu.

V tomto případě je nutné spustit v systémové databázi účetní firmy (nikoliv v systémové nové licence!!) uloženou proceduru dbo.hp_RozkopirujZaplaty, která rozkopíruje existující záplaty tam, kde chybí. Tedy EXEC dbo.hp_RozkopirujZaplaty.