web-dev-qa-db-ja.com

.batファイルは手動で機能しますが、SQL Serverエージェントジョブでは何もしません

.batファイルを特定のフォルダーにコピーする.exeファイルを実行し、それを実行していくつかのファイルを手動で抽出できます。

SQL Serverエージェントジョブ(ステップ1)の一部として使用すると、「Daily_Update」というジョブが成功しますbut実際には何もしません。

SQL Serverがあるサーバーは、ファイルが移動および実行されるファイルの場所とは異なります。 UNCパスでファイルの場所を指定しています。 \\A10は、操作しているスクリプトと.datファイルを備えたサーバーです。\\A08は、SQL Serverを備えたサーバーです。

ディスク指定子c:\表記を使用すると、次のようになります。

指定されたパスが見つかりません。

UNCパス名を使用すると、次のようになります。

アクセスが拒否されました。

SQL Serverが存在するサーバーのデスクトップから.batファイルを実行すると、手動で正常に動作します。

なぜこれが起こっているのでしょうか?

1
ivan7707

SQL Serverユーザーアカウントはその特定のフォルダーにアクセスできますか?
簡単なxp_cmdshellを実行して、それを確認してください。

EXEC master.dbo.xp_cmdshell 'dir C:\<path>'
2
Danilo Braga

既定の構成では、SQL Serverエージェントは、SSMSにログインしたときと同じユーザーアカウントでは実行されません。たとえば、「SQL Serverエージェント」システムサービスはsqlagentユーザーアカウントで実行されます。 「SQL Server」サービスはdataengの下で実行されます。 SSMSのクエリは、自分のユーザー名で実行されます。 mpag

システムサービスのSQL Serverエージェントの "ログオン"で参照されているユーザー名に、バットおよびバット自体のあるディレクトリへの読み取り/実行(またはrwx)アクセス権があることを確認します。

これをする

  1. @ Danのアドバイス に従い、_SQL Server_サービスがアクセスできるかどうかを簡単に確認します。ただし、_SQL Server_が使用されている場合でも、_SQL Server Agent_-質問で使用しようとしている-は使用できません
  2. Start-> Run _services.msc_を実行します。プロンプトが表示されたら、Windows(DBではなく)管理者のユーザー名とパスワードを入力します。
  3. 「ログイン」列が表示されない場合は、_View->Add/Remove Columns_を介して追加し、Detailビューに切り替えます。
  4. SQL Server (MSSQLSERVER)およびSQL Server Agent (MSSQLSERVER)エントリまでスクロールし、それぞれの[ログイン名]列の(domain \)ユーザー名を確認します。締め切り_services.msc_
  5. _Windows Explorer_(別名_(My) Computer_)で.batファイルが含まれているディレクトリを右クリックし、Propertiesを選択します。
  6. クリックしてSecurity(タブ)-> Edit(ボタン)-> Add(ボタン)
  7. 上記のステップ4のユーザー名の1つを追加し、[OK]をクリックします
  8. 手順4の2番目のユーザー名がある場合は、もう一度Addをクリックし、他のユーザー名を追加して[OK]をクリックします
  9. 追加したユーザー名を強調表示し、[読み取りと実行]および[フォルダーの内容を一覧表示]をクリックします。スクリプトが出力ファイルも生成する場合は、「書き込み」もクリックします。他の許可はあなたの裁量にあります。必要に応じて、他のユーザー名について繰り返します。 OKをクリックします
  10. ファイル自体のアクセス許可を確認して、フォルダーの設定がフォルダー内のバッチファイルに反映されていることを確認してください。基本的に、手順5を繰り返します(ただし、フォルダーではなくファイルを使用します)。必要に応じて、手順6〜9を繰り返します。今回は「書き込み」権限は必要ありません。
  11. コピー操作の宛先が別のフォルダーである場合は、そのフォルダーまたはディレクトリツリーのアクセス許可も有効にする必要があります。 5-9をもう一度繰り返します(「書き込み」アクセスを含む)。
3
mpag