none
programmgesteuerter Start eines SQL-Server-AGent-Pakets schlägt fehl ... RRS feed

  • Frage

  • Ich versuche, per VB.NET-Code einen vorhandenen AUftrag des SQL-Server-AGents ausserhlab des üblichen Zeitplanes zu starten.

    Dazu soll angeblich die Prozedur "sp_start_job" dienen.

    Den Code dazu habe ich von hier http://msdn.microsoft.com/de-de/library/ms403355(v=sql.100).aspx übernommern und lediglich durch Angabe meiner spezifischen Daten abgeändert.

    z.B.:

    Dim Dim xx As New System.Data.SqlClient.SqlConnection("Data Source=GALILEO2010;Initial Catalog=msdb;Integrated Security=SSPI")

    und den Namen des Jobs ("Hole_HBCI-Kontoauszug")

    Dennoch beschwert sich das Programm der Job sei nicht vorhanden.

    Auch die Angabe einer GUI-ID hat mich nicht weitergebracht.

    Gibt es da eine Lösung ?

     

    Donnerstag, 28. April 2011 07:10

Antworten

  • Der Besitzer ist nicht so wichtig, nur der User, der den Job starten will braucht auch die Rechte, wie sie unter sp_start_job aufgeführt sind.

    Und deswegen auch die Frage, wie Du Dich über SSMS anmeldest; den der Code oben meldest sich mit dem aktuellen Windows Account an.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    • Als Antwort markiert NicoNi Donnerstag, 28. April 2011 13:26
    Donnerstag, 28. April 2011 09:47

Alle Antworten

  • Hallo NicoNi,

    und wenn Du in SSMS den gleichen Befehl

    EXEC msdb..sp_start_job 'JobName'

    ausführst, geht es dann? Wenn man den richtigen Jobnamen angibt, geht das eigentlich.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Donnerstag, 28. April 2011 07:35
  • Leider funktioniert das :-(

    Am Job-Namen kann es eignetlich nichgt liegen . Ich hatte erst den Namen mit '-' und '_' im Verdacht

    Ich poste mal den ganzen Code:

    dim sqlconnection As New System.Data.SqlClient.SqlConnection("Data Source=GALILEO2010;Initial Catalog=msdb;Integrated Security=SSPI")
      Dim sqlcommand As System.Data.SqlClient.SqlCommand
      Dim par_jobname As SqlClient.SqlParameter
      Dim jobReturnValue As SqlClient.SqlParameter
      Dim par_servername As SqlClient.SqlParameter
    
      sqlcommand = New SqlClient.SqlCommand("sp_start_job", sqlconnection)
      sqlcommand.CommandType = CommandType.StoredProcedure
    
      par_jobname = New SqlClient.SqlParameter("@job_name", SqlDbType.VarChar)
      par_jobname.Direction = ParameterDirection.Input
      sqlcommand.Parameters.Add(par_jobname)
      par_jobname.Value = "Hole_HBCI-Kontoauszug"
    
    
      par_servername = New SqlClient.SqlParameter("@server_name", SqlDbType.VarChar)
      par_servername.Direction = ParameterDirection.Input
      sqlcommand.Parameters.Add(par_servername)
      par_servername.Value = "GALILEO2010"
    
      jobReturnValue = New SqlClient.SqlParameter("@RETURN_VALUE", SqlDbType.Int)
      jobReturnValue.Direction = ParameterDirection.ReturnValue
      sqlcommand.Parameters.Add(jobReturnValue)
    
      'Verbindung öffnen
      sqlconnection.Open()
    
      'Job ausführen
      sqlcommand.ExecuteNonQuery()
      Debug.Print(DirectCast(sqlcommand.Parameters("@RETURN_VALUE").Value, Integer))
      sqlconnection.Close()
    
    Donnerstag, 28. April 2011 08:01
  • Ich denke Du mußt hier:
    sqlcommand = New SqlClient.SqlCommand("sp_start_job", sqlconnection)
    "exec" mit angeben.

    sqlcommand = New SqlClient.SqlCommand("exec sp_start_job", sqlconnection)

    oder gleich den ganzen Befehl zusammenbauen, anstatt die Parameter einzeln zu übergeben.

    Donnerstag, 28. April 2011 08:28
  • Hallo,

    ich habe es gerade mal bei mir nachvollzogen, wenn auch etwas umgeschrieben; damit geht es einwandfrei und im Verlauf steht dann auch, das der Job ausgeführt wurde. Ist GALILEO2010 wirklich der Rechnername mit einer Standard-Instanz oder ist es ein Alias? Lass einfach mal den server_name Parameter weg.

    Imports System.Data.SqlClient
    
    Module JobStart
    
      Sub Main()
    
        Using conn As New SqlConnection("Data Source=MeinServer\MeineInstanz;Initial Catalog=msdb;Integrated Security=SSPI")
    
          Using cmd As New SqlCommand("sp_start_job", conn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@job_name", "Log-Sicherung UserDBs, stündlich.STEP1").SqlDbType = SqlDbType.NVarChar
    
            Try
              conn.Open()
              Dim result As Integer = CInt(cmd.ExecuteScalar)
              Console.WriteLine(IIf(result = 0, "Erfolgreich gestartet", "Fehler"))
              conn.Close()
            Catch ex As SqlException
              Console.WriteLine(ex.Message)
            End Try
    
          End Using
    
        End Using
    
        Console.ReadKey()
      End Sub
    
    End Module
    

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Donnerstag, 28. April 2011 08:43
  • Mir fallen 2 Dinge auf:

    1. Ich verweise NUR auf den Servernamen, nicht aber auf eine Instanz (habe auch keine spezielle)

    2. Du verweist explizit auf ".STEP1".

     -- muss das sein ? Mein Job enthält 5 Schritte

    -- wenn ja, bei mir existiert natürlich kein STEP1, sondern ein anderer Name

    Donnerstag, 28. April 2011 09:17
  • Wenn es eine Standard Instanz ist, braucht man keinen \Instanzennamen angeben; andernfalls würde auch bereist die Connection fehlschlagen, da der Server nicht gefunden werden könnte.

    Als Namen verwende ich den Namen des Jobs, wie er in SSMS unter "Sql Server Agent" => "Aufträge" sowie in den Eignschaften des Job aufgeführt wird; bei mir heisst er halt hinten mit .STEP1.

    Und wenn Du das Statement mit dem Jobnamen in SSMS ausführst, geht es ja. Ähem, meldest Du Dich in SSMS auch mit der Windows Authentifizierung an oder verwendest Du da einen SQL Account? Nicht, das Dein Windows Account keine Rechte hat, den Job überhaupt zu sehen/auszuführen.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Donnerstag, 28. April 2011 09:29
  • Die Fehlermeldung ist irreführend.

    Es scheint tatsächlich ein Rechteproblem zu sein.

    Der Job hat als Besitzer die Domänenanmeldung des Administrators.

    Das programm, welches den Job versucht aufzurufen, wird aber von einem normalen Domänen-Account ausgeführt.

    Lässt sich das irgendwie umgehen ? Mir scheint, ich kann nicht mehrere "Besitzer" für den Job angeben - oder ?

     

    Donnerstag, 28. April 2011 09:35
  • Der Besitzer ist nicht so wichtig, nur der User, der den Job starten will braucht auch die Rechte, wie sie unter sp_start_job aufgeführt sind.

    Und deswegen auch die Frage, wie Du Dich über SSMS anmeldest; den der Code oben meldest sich mit dem aktuellen Windows Account an.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    • Als Antwort markiert NicoNi Donnerstag, 28. April 2011 13:26
    Donnerstag, 28. April 2011 09:47
  • Ich glaube, ich hab's.

    Alle User, die in der Lage sein sollen, den Job zu starten müssen Mitglied der Rolle SQLAgentOperatorRole sein.

    Dann scheint es zu gehen.

    Vielen Dank

    Donnerstag, 28. April 2011 13:26