web-dev-qa-db-ja.com

アクセス権のあるファイルでBULK INSERTが「...アクセスが拒否されたため、一括読み込みできません」を取得する

一括挿入を実行しようとしていますが、アクセス拒否エラーが発生します。これまでのところ、私は以下を試しました:

  • 自分のマシンからファイルを開くことができます
  • Windows認証を使用してSQL Serverにログインしています(v2008 R2&v2016を試してみました)。
  • 私はシステム管理者権限を持っています
  • Xp_cmdshellを使用してファイルをtypeできます(SQLサービスアカウントを使用しますが、ファイアウォールであるという考えがなくなります)
  • パスはローカルドライブではなくネットワークURLです

私が使用しているコマンドはこれです:

BULK INSERT ken_temp
FROM '\\network_path\temp\kdf\text_file.txt'
WITH
   (
    FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
   ,ROWS_PER_BATCH = 50000
   ,MAXERRORS = 10
   )

何か案は?

6
Kenneth Fisher

問題はそれです:

  1. Windows認証を使用してログインしています。これは、SQL ServerがファイルシステムアクセスのためにWindows /ドメインアカウントを偽装しようとすることを意味します。

  2. ワークステーションに直接ログインし、SQL Serverにリモートで接続しています。これは、SQL Serverを実行しているサーバーにワークステーションから認証トークンを渡すことにより、SQL Serverを実行しているサーバーに間接的に接続したことを意味します。

  3. SQL Serverの委任を有効にしていません。これは、直接ログインから1ステップを超えてそのトークンを渡すことが許可されないというデフォルトの動作で立ち往生していることを意味します。

  4. リモートリソースに存在するファイルを読み取ろうとしています。これは、直接ログインした場所を1ステップ以上超えていることを意味します。

これが、ワークステーションから問題なくファイルにアクセスできる理由です。また、サービスアカウントがSQL Serverを実行しているサーバーに直接ログインし、リモートリソースが1ステップ先なので、xp_cmdshellの使用も機能するのはそのためです。

SQL Serverを実行しているサーバーに直接リモートデスクトップする場合、そのサーバーでSSMSを実行し、BULK INSERTを実行すると、成功するのではないかと思います。または、SQL Serverログインを設定し、ログインに「一括管理」権限を付与し、次にEXECUTE AS Login = 'JustReadTheDangFileAlready';を付与して、BULK INSERTを実行した場合にも機能します。 BULK INSERT/OPENROWSET (BULK...)をSQL Serverログインとして実行する場合、偽装するWindowsアカウントがないため、ファイルシステムへのアクセスは、xp_cmdshellと同様のサービスアカウントを使用して行われます。

次の選択肢があります。

  1. SQL Serverの委任を有効にします(それがサービス用かアカウント用かを思い出せません。その場合、それが必要なのはWindowsアカウントかもしれませんが、SPNのセットアップを含む、これをセットアップする方法に関するガイドがあります) 。私はこれが好ましい/推奨される選択だと信じています。これにより、プロセスは、直接ログインからさらに削除されたリソースに認証トークンを転送できます。

  2. このプロセスにはSQL Serverログインを使用します。私がこれを提案しているとは信じられませんが、「一括管理」固定サーバーロールにあるSQL Serverログインを使用している場合ORには、正しい「一括管理」権限がありましたが、次に、そのログインに関連付けられたユーザーを(適切なDBに)作成し、BULK INSERTWITH EXECUTE AS 'JustReadTheDangFileAlready'を使用して作成されたストアドプロシージャに配置します。次に、そのprocを実行して、要求がWindowsアカウントからのものであることをマスクする必要があります。

  3. そのリモートファイル(およびおそらくフォルダーも?)のアクセス許可を開きます。 「Everyone」に「読み取り」アクセス許可を与えることができます(フォルダの「読み取り」または他の何らかのアクセス許可も)。

  4. この質問を削除し、この「エラー」を、HBAカードを介して接続され、ローカルドライブとして表示される高価なSANを必要とする理由として使用してください。????CFOに伝えてください:「これが本当に方法。インターネットはそう言った。」

4
Solomon Rutzky