Ich habe mehrere SQL Server Agent-Jobs, die nacheinander ausgeführt werden sollen. Um einen guten Überblick über die Jobs zu erhalten, die ausgeführt werden sollen, habe ich einen Hauptjob erstellt, der die anderen Jobs mit einem Aufruf an aufruft EXEC msdb.dbo.sp_start_job N'TEST1'
. Der sp_start_job
Vorgang wird sofort beendet (Job Schritt 1), aber dann möchte ich, dass mein Hauptjob wartet, bis der Job TEST1
beendet ist, bevor ich den nächsten Job anrufe.
Also habe ich dieses kleine Skript geschrieben, das direkt nach dem Aufruf des Jobs ausgeführt wird (Jobschritt 2) und den Hauptjob zwingt, zu warten, bis der Unterjob beendet ist:
WHILE 1 = 1
BEGIN
WAITFOR DELAY '00:05:00.000';
SELECT *
INTO #jobs
FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
@execution_status = 0, @job_aspect = N''JOB''');
IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
BEGIN
BREAK
END;
DROP TABLE #jobs;
END;
Das funktioniert gut genug. Aber ich hatte das Gefühl, dass intelligentere und / oder sicherere ( WHILE 1 = 1
?) Lösungen möglich sein sollten.
Ich bin neugierig auf folgende Dinge und hoffe, dass Sie mir einige Einblicke geben können:
- Was sind die Probleme bei diesem Ansatz?
- Können Sie einen besseren Weg vorschlagen, dies zu tun?
(Ich habe diese Frage zuerst bei StackOverflow gestellt , weil ich mich auf die Verbesserung des Codes konzentriert habe. Immer noch gültig. Aber ich vermute, dass die Leute hier im Allgemeinen klügere Dinge zu sagen haben, warum ich nicht versuchen sollte, dies so zu tun, wie ich es tue. ' Ich mache es jetzt oder biete gute Alternativen.)
EDIT (25. Juli)
Anscheinend ist an meinem Skript nicht allzu viel falsch, da nur wenige Antworten auf Probleme hinweisen :-) Die Alternative zu dieser Art von Skripten scheint darin zu bestehen, ein Tool zu verwenden, das für diese Skripte entwickelt wurde Aufgaben (wie SQL Sentry Event Manager oder ...) - oder ein solches Tool selbst zu schreiben. Wir werden ein solches Tool in meiner derzeitigen Firma nicht kaufen, daher bleibe ich vorerst beim Skript.
quelle
Antworten:
Haftungsausschluss: Ich arbeite für SQL Sentry.
Unser SQL Sentry Event Manager- Produkt verfügt über eine genau dafür entwickelte Funktion: Jobs verketten und in verschiedenen Workflow-Reihenfolgen anordnen.
Ich habe vor Jahren mit SQL Sentry begonnen, bevor ich jemals in das Unternehmen eingetreten bin, um genau dies zu tun. Was ich wollte, war eine Möglichkeit, einen Wiederherstellungsjob auf unserem Testserver sofort nach Abschluss der Sicherung in der Produktion zu starten.
Was ich ursprünglich implementiert hatte, war nur ein wesentlicher Puffer zwischen der Startzeit des Sicherungsjobs und der Startzeit der Wiederherstellung. Das war nicht gerade narrensicher; Da die Sicherungszeiten variierten, verschwendete der Puffer oft Zeitverschwendung, wenn eine Wiederherstellung nicht gestartet wurde, obwohl dies möglich gewesen wäre. Und gelegentlich war der Puffer nicht genug.
Was ich als nächstes implementiert habe, war ähnlich wie das, was Sie haben - ich habe einen Job auf dem Testserver geschrieben, der kurz nach der geplanten Sicherung gestartet wurde, und habe weiter abgefragt, um zu sehen, wann der Job beendet wurde. Dies wurde später geändert, um nur einen zweiten Schritt im Sicherungsjob zu haben, mit dem eine Tabelle auf dem Testserver aktualisiert wurde. Nicht wirklich anders, außer dass der Wiederherstellungsjob nur eine Tabelle lokal überwachen musste, anstatt den Jobverlauf remote zu überwachen. Wenn man zurückdenkt, könnte dies ein Auslöser für diese Tabelle gewesen sein, die aufgerufen wurde,
sp_start_job
sodass der Job nicht alle n Minuten ausgeführt werden musste (oder überhaupt geplant werden musste).Die endgültige Lösung bestand darin, Jobs miteinander zu verketten. Wenn die Sicherung auf Server A abgeschlossen ist, startet Event Manager den Wiederherstellungsjob auf Server B. Und wenn es einen dritten Job und einen vierten Job oder eine bedingte Logik gibt, die darauf basiert, was zu tun ist Wenn ein Job fehlschlägt oder erfolgreich ist usw., kann dies alles berücksichtigt werden. Der Workflow-Designer wird Sie einiges an SSIS erinnern:
Die zugrunde liegende Mechanik dessen, was ich beschreibe, ist natürlich keine Raketenoperation. Sie könnten diese Art von Kettenverpackung selbst schreiben, wenn Sie sich hinsetzen und es tun würden. Wir bieten Ihnen nur eine Alternative, bei der Sie nicht müssen.
quelle
Das Hauptproblem bei Ihrem Ansatz ist, dass Sie sich ständig drehen müssen, bis etwas passiert (was eine schrecklich lange Zeit oder sogar nie sein kann), und das fühlt sich nicht ganz richtig an. Deshalb stellen Sie wohl die Frage.
Wie wäre es also mit einem datengesteuerten Ansatz für Ihr Problem? Erstellen Sie beispielsweise eine 'Audit'-Tabelle, in die jeder Job beim Starten und Beenden schreibt:
Erstellen Sie eine 'Verarbeitungstabelle', in der alle Jobs und die Reihenfolge aufgelistet sind, in der sie ausgeführt werden müssen:
Erstellen Sie einen Einfügetrigger für die Überwachungstabelle, sodass der Trigger nach Abschluss eines Jobs und Einfügen des Überwachungsdatensatzes die Verarbeitungstabelle für den nächsten Job (nach Ausführungsreihenfolge) abfragt und dann startet.
Die Vorteile dieses Ansatzes sind:
HTH
quelle