Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Fernsteuerung für SQL Server-Agent

Aufträge im SQL Server-Agent erledigen die immer wiederkehrenden Aufgaben bei der Datenverarbeitung in BI-Projekten. Meistens werden die Aufträge zeitgesteuert gestartet, der Benutzer braucht sich um nichts kümmern.
Es gibt jedoch Fälle, in denen die Aufträge manuell gestartet werden sollen. Für einen Administrator mit Zugang zum Server, mit einer vorhandenen Managementkonsole für den SQL-Server und den passenden Berechtigungen auf der msdb-Datenbank ist das ein Leichtes. Doch wie kann ein Anwender ohne Zugang auf den Server und ohne SQL-Server Client Tools einen Auftrag starten? Mit dem DeltaMaster SQL-Durchgriff ist das kein Problem…

Die Idee ist einfach: Dem Benutzer werden lediglich Schreibrechte auf eine Steuertabelle gegeben. Nachdem der Benutzer dort mit einer Eingabe ein Flag setzt, soll ein Job gestartet werden. Diese Aufgabe kann z.B. ein Datenbanktrigger übernehmen. In dieser Steuertabelle können auch weitere Informationen wie Startzeit und Status des Jobs gespeichert werden. Ein Beispiel:

1. Anlegen der Tabelle und einrichten der Schreibberechtigung für DeltaMaster (nur in Verbindung mit DeltaMaster Modeler)

Create Table T_Jobverwaltung (
   ID int primary key ,
   Job varchar (250),
   StartJob bit default 0,
   JobStatus varchar (50),
   LetztesStartDatum datetime,
   LetztesStopDatum datetime,
   RowID uniqueidentifier default newid()
   )
go
exec P_BC_Generate_DeltaMasterTableProc 'T_Jobverwaltung', 'T_Jobverwaltung' 
go

Neben der Tabellen-ID und dem Namen des Jobs (der hier in diesem Beispiel gleich heißen muss wie der Name des Auftrags im SQL Server-Agent) soll die Spalte “StartJob” steuern, ob der Job ausgeführt werden soll. Die Spalte hat den Datentyp bit. Nach der Eingabe einer „1“ soll der Auftrag gestartet werden. Um die Steuerung für den Anwender lesbarer zu machen, werden die Zusatzinformationen wie “JobStatus” und die zwei Datumsfelder ebenfalls mitgeführt.

2. Tabellentrigger anlegen

Nach jeder Änderung in der Tabelle wird geprüft, ob die Spalte “StartJob” wahr gesetzt wurde. Folgender Trigger übernimmt die Aufgabe:

Create Trigger tr_StartJob
   on T_Jobverwaltung
   After update
 as

 Declare @Jobname varchar (250)

  Select @Jobname = (Select Min (Job) From T_Jobverwaltung Where StartJob = 1)

  if @Jobname is not null
  Begin
     --Starte job
     exec msdb.dbo.sp_start_job @Jobname

     --Status 'läuft' setzen
     Update T_Jobverwaltung
     Set JobStatus = 'running....',
         LetztesStartDatum = getdate()
     Where Job = @Jobname 
End

Wird eine Eins eingegeben, wird der Jobname ausgelesen und der gleichnamige Auftrag mit der Prozedur “msdb.dbo.sp_start_job” gestartet. Eine Berechtigung für diese Prozedur ist auf der msdb-Datenbank für den Benutzer vorher einzurichten.

3. Einbinden der Tabelle in DeltaMaster

Die Tabelle muss jetzt nur noch im DeltaMaster SQL-Durchgriff für die Eingabe freigegeben werden und die .das-Datei dem Benutzer zur Verfügung breitgestellt werden.

Steuertabelle bereit für die Eingabe
Abb. 1: Steuertabelle, bereit für die Eingabe

Nach Eingabe des Häkchens in Spalte “StartJob” wird der Auftrag wie gewünscht gestartet.

4. Prozedur nach Jobende anlegen

Wie erfahren wir aber, wann der Job zu Ende ist und wie reaktivieren wir wieder die Eingabe? Folgende Prozedur hilft weiter:

[/code]
Create Proc P_BC_Jobverwaltung_Stop as
    Update T_Jobverwaltung
    Set LetztesStopDatum = getdate (),
       StartJob = 0,
       JobStatus = 'finished!'
    Where Job = (Select Min (Job) From T_Jobverwaltung Where StartJob = 1) 
[code]

Nach dem letzten Schritt des Auftrages rufen wir danach diese Prozedur auf. Sie schreibt das Stop-Datum und setzt den Status sowie den „StartJob“ wieder zurück auf Null.

JobEnde setzen
Abb. 2: JobEnde setzen