none
Bulk Insert で、CSVファイルがアクセス拒否で読み込まれません。 RRS feed

  • 質問

  • お世話になります。

    Bulk Insert を行なうストアドを、SQL Server2012 に作成し、バッチファイルからSqlcmdで呼び出すと、

    「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」エラーになります。

    またストアド側のエラーは以下です。

    「ファイル "(CSVファイル名)" を開けなかったので、一括読み込みできません。
    オペレーティング システム エラー コード 5(アクセスが拒否されました。)。」

    Bulk Insert するストアドは以下です。

    ALTER procedure [dbo].[SP_hogehoge] (
     @strCSVFileName  varchar(max) ,
     @strTableName  varchar(max) 
    )
    AS
     declare @strSQL   varchar(max)
     declare @strColumnName varchar(max)
    /*
    ** 半角カンマをデリミッタとして、CSVデータをテーブルに読み込む。
    */
     set @strSQL = 'bulk insert [dbo].[' + @strTableName + ']' +
         'from ''' + @strCSVFileName + ''' ' +
         'with (' +
         ' FIRSTROW = 2 ' +
         ',FIRE_TRIGGERS ' +
         ',FIELDTERMINATOR='','' ' +
         ',ROWTERMINATOR=''\n'' ' +
         ')'
     execute(@strSQL)

    また、バッチファイル(WinServer2012)からは以下の手順でストアドを呼び出しています。

    Sqlcmd -U (ログイン名) -P (パスワード) -S (サーバ名) -d (データベース名) -Q "execute dbo.SP_hogehoge '(CSVファイル名)', '(Insert先Table名)'

    別サーバーの同一環境では動いていたストアド&バッチファイルですので、SQL Serverの設定の違いが原因かと思い、比較してみたところ、
    システム ストアドプロシージャ に名称が dt_ から始まるストアドがありませんでした。

    また、セキュリティ > ロール > データベースロール > public のプロパティの

    セキュリティ保護可能なリソース に スキーマ=dbo の dt_ から名称が始まるストアドがやはりありませんでした。

    dt_XXのストアドがないのがBulk Insert のエラー原因なのかはわかりませんが、もしこれが原因だとしたら
    システムストアドの登録方法がわかりません。
    また dt_XXのシステムストアドが無い事がほかの不具合につながらないか、不安にもなっています。

    これらにお詳しい方、回答方よろしくお願い致します。

    2017年3月25日 15:11

回答

  • で、結局、SQLServerのサービスアカウントからは触れるファイルなんですか?
    「件のCSVファイルは、削除も編集も自由自在です」といわれても、それはローカルなユーザからは触れるって話で、サービスアカウントでログインしているわけじゃないんでは?

    jzkey

    2017年3月30日 22:48

すべての返信

  • 「一括読み取りできません」と言われているのなら、ストアド→Bulk Insert実行まではなされています。

    問題はエラーメッセージの通り「指定したCSVが、SQLServerの実行アカウントから読み取れるか」というNTFSのセキュリティの話ではないでしょうか。
    あるいはひょっとすると、プログラムでCSVを作ってたりするのであれば、そのハンドルが開きっぱなしになっているのにストアドを発行したという可能性も、ま、無いわけではないですが。


    jzkey

    2017年3月27日 14:04
  • jzkey様、

    回答ありがとうございます。

    件のCSVファイルは、削除も編集も自由自在です。「別のプロセスってどこ?」ってな感じです。

    従って、jzkey様ご指摘のCSV作成元が掴んでる事もないです。

    (CSVファイルは別サーバーからcpコマンドで持ってきています)

    現在は、CSVファイルを読んでDBに落とすプログラムをVBで作りました(代替措置)。

    この代替策が時間稼ぎになってくれれば助かるのですが…。

    何かお気づきの点がありましたら、ご連絡ください。

    2017年3月30日 9:07
  • で、結局、SQLServerのサービスアカウントからは触れるファイルなんですか?
    「件のCSVファイルは、削除も編集も自由自在です」といわれても、それはローカルなユーザからは触れるって話で、サービスアカウントでログインしているわけじゃないんでは?

    jzkey

    2017年3月30日 22:48
  • jzkey様、

    回答ありがとうございます。

    また返信が遅くなりまして、すみません。
    (別件の担当に回されてしまって。。。)

    引き継いだ担当者に確認しましたら、SQL Serverのサービスアカウントから触れるファイルだそうです。

    現在代替策で稼働させてしまっており、特に問題も出ていない為、このままでいく…という事になっているようです。

    いろいろと申し訳ありませんでした。

    2017年7月26日 1:25