SQL Server agent je nástroj integrovaný do SQL Serveru, jehož hlavním účelem je automatické plánování a spouštění úloh. Prostřednictvím SQL Agenta si můžeme založit tzv. Job a v rámci Jobu naplánovat jednotlivé úlohy – třeba spuštění skriptu, SSIS package, powershellu a mnoho dalšího. SQL Server agent je ale bohužel dostupný až od edice Standard a výše. Tím pádem jej v Edici SQL Server Express nenajdeme. Existuje ale alternativa.
V minulém článku o SQL Server Command utility 1 jsem ukazoval, jak se dá přes příkazový řádek spustit SQL skript. Tuto znalost zde využijeme a v kombinaci s Windows Task schedulerem 2 si ukážeme, jak je možné definovat libovolné množství po sobě následujících SQL úloh a tyto spuštění těchto úloh si naplánovat na určitý čas.
Task scheduler jako náhrada za SQL Server agent
Jak bylo zmíněno, tak jako náhradu za SQL Agenta využijeme nástroj integrovaný v operačním systému Windows, a to Task scheduler. Je to nástroj, který umožňuje vytvořit:
- Tasky (Úlohy) – obdoba Jobu u SQL Server Agent
- Actions (Akce) – obdoba Stepu u SQL Server Agent
- Triggery (Časové plány) – obdoba Scheldules u SQL Server Agent
Princip je velice jednoduchý a ukážu jej na srovnání a později pro jistotu ještě na příkladu.
Vytvoření SQL Server Agent jobu a stepů (úloh)
U SQL Server agenta vytváříme Joby a do každého jobu umístíme Stepy (úlohy) a spuštění jobu naplánujeme na určitý čas (viz. obrázky).
Jak funguje Windows task scheduler
U Tasku přes Windows task scheduler je princip podobný jak můžete vidět na obrázku níže – stojíme nad detailem 1 Tasku jménem Test.
- Na kartě Actions vidíme jednotlivé kroky, které mají být v rámci tasku spuštěny
- Na kartě Triggers vidíme naplánovaný čas spuštění daného Tasku
Příklad – Jak nahradit SQL Server Agent – Postup
Zde ukážu jeden z možných postupů, jak to udělat. Dejme tomu, že potřebujeme připravit 2 úlohy. První úloha je podobná jako ta z minulého článku o sqlcmd a dále přidáme ještě jednu úlohu – to znamená že:
- Založíme tabulku “Biportal_Step_1” a vložíme do ní 1 záznam “Hello World”
- Dále založíme tabulku “Biportal_Step_2” a vložíme do ní záznamy “Hello World 1″,”Hello World 2″,”Hello World 3″,”Hello World 4″,”Hello World 5”
Když to shrnu, tak přes task scheduler spustíme 2 skripty:
- sqlcmd -S SQL_INSTANCE -Q “USE [Temp];CREATE TABLE Biportal_Step_1 ([ID] INT IDENTITY(1,1) PRIMARY KEY, [Text] VARCHAR(255));INSERT INTO Biportal_Step_1 ([Text]) VALUES(‘Hello world’);”
- sqlcmd -S SQL_INSTANCE -Q “USE [Temp];CREATE TABLE Biportal_Step_1 ([ID] INT IDENTITY(1,1) PRIMARY KEY, [Text] VARCHAR(255));INSERT INTO [Temp].[dbo].[Biportal_Step_2] ([Text]) VALUES (‘Hello World 1’),(‘Hello World 2’),(‘Hello World 3’),(‘Hello World 4’),(‘Hello World 5’);”
Připravíme folder pro bat soubory
Když chceme spustit nějakou úlohu přes task scheduler, tak nejlepším postupem je vytvořit si batch soubory (dávky). Je to jednoduché:
- Založíme si Folder – nazvěme ho třeba “SQL Automation”
- Otevřeme Notepad a nachystáme si dávky, každý .bat soubor reprezentuje 1 úlohu. V našem případě si tedy připravíme 2 soubory
Vytvoříme bat soubory a nahrajeme do folderu
Do každého ze souborů vložíme naše skripty v následujícím formátu (ukázka Step 1 – Create table Biporta_Step_1.bat):
Vysvětlení batch souboru: Nejprve spustíme příkazový řádek (první start:), poté náš první skript (druhý start) a nakonec relaci ukončíme. Klikneme next
Vytvoříme task v task scheduleru
Poté co máme připraveny oba soubory, tak otevřeme Task scheduler a klikneme na “Create basic task” a náš nový task nazveme “Biportal_SQL_Automation”
Nastavíme task scheduler trigger a čas spuštění
O krok dále nastavujeme Trigger – tzn. frekvenci, s jakou chceme aby se task spouštěl. V našem případě máme jednorázový SQL úkol, kteoru budeme pouštět pouze jednou, ale většinou budete potřebovat pouštět úlohy opakovaně – např 1x denně. Zvolíme tedy Daily a klikneme next
V dalším okně nastavujeme čas spuštění Tasku a klikneme next
Nastavení akce – start a program
V dalším okně nastavujeme akci, kterou má Task scheduler vykonat, v našem případě budeme chtít spustit program. Volíme tedy Start program a klikneme next.
Nastavíme cestu na batch soubor
V posledním kroku nastavujeme cestu na náš batch soubor (viz 1), který má být spuštěn a klikneme next.
Okno akcí – task se podařilo založit
Zobrazí se nám souhrnné okno a po jeho potvrzení máme vytvořen task. Zatím má task ale pouze 1 akci (step). Musíme ještě nastavit náš druhý step. proto poklikáme na náš task a otevřeme jej, Přejdeme na kartu “Actions”, klikneme na “New”, nastavíme cestu na druhy batch soubor a potvrdíme. Nyní bychom měli mít nastaven task, který obsahuje 2 akce. Tyto akce se pouští ve vámi zvolený čas (nastaveno v kroku 5).
Otestování tasku
Tak si zkusíme task pustit a uvidíme co se stane. Klikneme pravým tlačítkem na task a dáme “Run”. Zkontrolujeme jestli je vše v pořádku – vypadá to ok a my umíme nahradit SQL Agenta 😉
Použité zdroje
- Microsoft, sqlcmd utility [on-line]. [cit. 2018-06-28]. Dostupné z WWW: https://learn.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver16
- Microsoft, Windows Task Scheduler [on-line]. [cit. 2018-06-28]. Dostupné z WWW: https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page
Dobrý den pane Zedníčku,
děkuji za článek o Agentovi. Prosím mohl byste popsat jak nejlépe vyřešit následující situaci.
Je potřeba spustit bat soubor, spouští selecty v ERP. Do ERP ale nemá přístup účet/user SQL Server Agent Service Account, který spoušít ten SQL job. Když jsem googlil, tak se musí nastavit credentials (identita) user, který má přístup do daného ERP. Setkal jste se s tím? Případně mohl byste prosím poradit jak to řešit?
Omlouvam se za pozdni odpoved, delsi dobu jsem nebyl na webu. Ano pujde to tak jak popisujete, nastavite si credentials v SQL Server, pote si v SQL agentovi vytvorite proxy a nasledne muzete poustet nejaky step v ramci SQL jobu pod danou identitou.