web-dev-qa-db-fra.com

Comment exécuter avec succès un fichier de commandes dans un travail SQL Agent?

J'ai un travail d'agent SQL qui génère un rapport spécifique dans un fichier PDF, puis copie le PDF dans un répertoire réseau, puis supprime le fichier PDF dans le fichier répertoire source.

Les travaux SQL se composent de 2 étapes: 1. Générez le rapport 2. Copiez le rapport à l'emplacement réseau.

Pour l'étape 2, j'ai créé un fichier bat qui gère la copie et la suppression du fichier pdf.

Le fichier bat est le suivant:

set source_dir=C:\Reports\Energie\Uur
set dest_dir=\\KWS2-WEB-SERVER\Share\Reports\Uur

C:\Windows\System32\Robocopy.exe %source_dir% %dest_dir% /MOV /Z

Cependant, lorsque j'exécute mon Job, il se bloque à la deuxième étape. Le statut reste juste sur "Exécution".

Voici la ligne que j'ai indiquée dans l'étape (emplacement du fichier bat à exécuter):

cmd.exe /c "C:\Reports\rapport_uur_copy.bat"

Mes paramètres de travail sont les suivants:

Étape 1

Type: système d'exploitation (CmdExec) En cas de succès: passez à l'étape suivante

En cas d'échec: quitter l'échec de rapport de travail

Étape 2

Type: système d'exploitation (CmdExec)

En cas de succès: quittez le travail en déclarant le succès

En cas d'échec: quitter l'échec de rapport de travail

Quelques faits:

  • J'ai des autorisations de lecture/écriture sur le répertoire réseau
  • J'exécute les étapes en tant que compte administrateur (l'utilisateur connecté, par défaut)
  • L'étape 1 réussit
  • J'exécute Windows Server 2008 R2 Standard
  • J'ai SQL Server 2008 R2
  • Lorsque j'exécute le script à partir de la cmd manuellement, cela fonctionne (sous le compte administrateur).
5
Nazeem

Il semble que vous devez configurer la deuxième étape de votre travail pour qu'elle s'exécute en tant que compte de domaine avec des autorisations pour écrire dans le partage \ KWS2-WEB-SERVER\Share\Reports\Uur ainsi que l'accès en lecture dans le dossier C:\Reports\Energie\Uur.

Vous devez d'abord ajouter des informations d'identification à SQL Server. Dans le dossier Security> Credentials, vous devrez cliquer avec le bouton droit de la souris et choisir New Credential ... Remplissez ces informations et cliquez sur OK.

Une fois cette opération terminée, vous devrez créer un proxy qui utilise ces informations d'identification. Dans le dossier Agent SQL Server> Proxies> Système d'exploitation (CmdExec), vous devrez cliquer avec le bouton droit et choisir Nouveau proxy ... Utilisez les informations d'identification que vous avez créées précédemment.

Vous pouvez maintenant configurer votre deuxième étape de travail pour utiliser le proxy que vous venez de créer à l'aide de la liste déroulante Exécuter en tant que: de la page de l'étape de travail.

2
Brian Bentley

Généralement, lorsqu'un travail comme celui-ci se bloque, c'est parce que l'exécution de la commande attend une réponse. Étant donné que toute exécution de commande exécutée à partir de SQL Server est exécutée en tant que shell et que vous ne pouvez pas voir le shell, il ne peut pas obtenir de réponse. Si j'étais vous, j'essaierais d'exécuter le fichier bat manuellement et de voir si on vous demandait une réponse. Si c'est le cas, corrigez cette partie (afin qu'elle ne demande pas de réponse) et réessayez.

Si l'exécuter vous-même ne vous aide pas, essayez de l'exécuter via xp_cmdshell et voyez si vous obtenez une sortie. Il se peut cependant qu'il se bloque.

2
Kenneth Fisher

Chaque étape que vous séparez de\CR\LF dans un script que vous avez écrit précédemment uniquement peut être exécutée dans AgentJob si vous choisissez l'une de ces deux options:

  • Toute ligne distincte dans votre script de chauve-souris doit être une étape distincte dans AgentJob
  • supprimez tous les\CR\LF et dans votre étape de l'AgentJob et mettez un && entre vos commandes
1
Clevemayer

J'ai eu le même problème exact. Mon travail SQL se bloquait et disait "Exécution ..." et ne se terminait jamais.

Ajoutez "--trust-model always" à votre fichier .bat.

Fondamentalement, votre fichier .bat s'exécute lorsque vous l'exécutez manuellement car vous en êtes le propriétaire. Il vous fait confiance. Lorsque vous exécutez le .bat en tant qu'utilisateur différent, la cmd affiche en fait un avertissement et vous demande si vous lui faites confiance. Votre travail est suspendu car la cmd attend votre réponse. L'ajout de "--trust-model always" sautera cette question et permettra au .bat de se terminer.

Croyez-moi. :)

1
snarkmark