Press "Enter" to skip to content

7 – MiniSqlAgent – Un servizio per eseguire Script T-SQL su qualsiasi SqlServer

Introduciamo in questo post quello che vogliamo realizzare con il servizio Windows che abbiamo fino a qui sviluppato per spiegare alcuni concetti fondamentali nella generazione di una applicazione .NET non banale. Il nostro Servizio Windows in questo momento è stato costruito in modo che il suo lavoro è fornire dei messaggi ad intervalli regolari, ora vogliamo trasformarlo in un Agent in grado di eseguire script Transact SQL su uno o più server SQL a cui può collegarsi.

Per costruire un sistema di questo genere, per prima cosa dobbiamo costruire gli oggetti che possono ospitare gli script SQL, una volta costruiti questi oggetti, dobbiamo creare il codice che li eseguirà all’interno del nostro servizio.

L’ispirazione

Visto che andremo ad imitare l’Agent di SQL Server possiamo copiare quello che esiste, pertanto curiosando all’interno dei Job di SQL Server Agent da SQL Management studio possiamo vedere che l’interfaccia è fatta nel seguente modo:

SqlAgent_01

Ogni job è composto di una serie di informazioni che sono le seguenti:

  • Informazioni generali,
    • nome del job
    • proprietario del job
    • categoria del job
    • descrizione del job

SqlAgent_02

  • Steps del job, si tratta di una serie di script SQL che l’agent esegue in sequenza quando richiesto.

SqlAgent_03

  • Schedulazioni del Job, permettono di decidere uno o più orari in cui il job verrà eseguito, queste schedulazioni possono essere ricorsive o con singolo target.

SqlAgent_04

  • Job Alerts, sono una serie di avvisi che possono essere inoltrati quando accade qualche evento particolare sul database, sono un tipo particolare di Job e possono essere eseguiti ascoltando gli eventi che si verificano sul server SQL, questo tipo di gestione esula dallo scopo del nostro Agent, per lo meno per la versione 1.0.

SqlAgent_05

  • La pagina delle notifiche, per inviare un messaggio e-mail o altro tipo di notifica quando il job da errore o quando il job va a buon fine o in entrambi i casi.

SqlAgent_06

Questa pagina permette di avere un server che controlla i Job di altri server se necessario, quindi permette di decidere il target server del job eseguito.

Il lavoro che è in grado di fare l’Agent di SQL Server è ovviamente completo e complesso, noi non pretendiamo di fare tutto quello che l’agent fa visto che stiamo costruendo un tutorial, però proveremo a costruire qualcosa di utile e funzionale e magari nel tempo ad aggiungere funzionalità al nostro servizio.

Vediamo come procederemo.

Abbiamo stabilito all’inizio del post che abbiamo due obiettivi per iniziare:

  • Creare un oggetto che rappresenta un Job
  • Aggiungere al codice del servizio il necessario perché questo Job venga eseguito.

L’ oggetto Job

Per rappresentare un Job abbiamo bisogno di una serie di elementi ben precisi da inserire in una classe dati, vediamo di individuare quali sono:

  • Il Job deve avere un identificativo univoco
  • Deve avere una descrizione
  • Deve contenere uno o più script SQL da eseguire
  • Deve contenere uno o più orari in cui deve essere eseguito
  • Deve contenere le informazioni per connettersi al server SQL su cui eseguire gli statement SQL
  • Deve contenere qualcosa che permetta di notificare errori, o esecuzione corretta dei job in qualche modo

Questa descrizione è piuttosto complessa, perciò il modo corretto di procedere è secondo noi per step, quindi decidiamo le informazioni minime che ci servono per definire un semplice Job con cui iniziare a lavorare:

  • Ci serve un ID ed una descrizione
  • Uno statement SQL
  • Un ora in cui eseguire il Job
  • Un intervallo per l’esecuzione successiva
  • Una connessione a SQL Server

Il Servizio

Una volta definito come è fatto il Job, vediamo che cosa deve fare il servizio:

  • Deve essere in grado di leggere tutti i Job dal luogo ove li memorizzeremo
  • Schedularne la prima esecuzione
  • Una volta eseguita schedulare la successiva
  • Inviare le notifiche richieste ai destinatari tramite gli indirizzi funzionali forniti

Anche in questo caso per iniziare non ci serve tutto quanto, dei quattro passi su indicati, l’ultimo è qualcosa di avanzato, pertanto lo tralascieremo nella prima scrittura, abbiamo descritto i requisiti necessari agli sviluppi da fare all’interno del nostro servizio, nei prossimi due post di questa serie inizieremo a costruire la nostra applicazione.