- PR -

ストアドプロシージャでbcp実行

1
投稿者投稿内容
くさの
会議室デビュー日: 2005/06/02
投稿数: 4
投稿日時: 2005-06-02 17:16
【WEBサーバ実行環境】
OS:Windows2000 Server SP4
【DBサーバ実行環境】
OS:Windows2000 Server SP4
DB:SQLServer2000 SP4

上記環境にてASP.net(VS 2003 C#)でWebアプリケーションの開発を行っています。
現在、クライアントからの要求でWebサーバを経由し
DBサーバ上にSQLServer内テーブルのエクスポートファイルを
以下の手順で作成しようとしているのですがうまくいきません。

(1)EXECUTE master.dbo.xp_cmdshell 'bcp TABLE1 out C:/1.txt -S XXX -U XXX -P XXX -f C:/fmt1.fmt'を実行するストアドプロシージャを作成.
(テキストファイル、フォーマットファイルのパスはDBサーバ上にあるパス)

(2)Webサーバから(1)のストアドをSqlCommand.ExecuteNonQuery()にて実行.

このとき、DBサーバの指定パスに空のテキストファイルが作成されてしまいます。
Webアプリのデバッグ(コマンドウィンドウ)でストアドを実行するSQL文をコピーし
アナライザで実行すると正しい内容のテキストファイルが作成されます。
SqlCommand接続時のユーザとアナライザ接続時のユーザは同じです。
そのユーザにはEnterprice Managerにより、Sysadminの権限をつけています。
エクスポート対象のテーブルの所有者はdboです。

また、(1)のストアドをDBサーバ、コマンドプロンプトにてosqlで実行すると成功します。
※WebサーバからDBへのSQL文発行は上記ストアド以外は正常に処理されます。

上記現象にお心当たりのある方、回避策等をご存知の方がいらっしゃれば
ご教授よろしくお願いいたします。


TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 18:39
空のデータファイルのみが作成されてしまう現象は

・指定したフォーマットファイルが消失している
・フォーマットファイルが置かれているパスにアクセス権がない

などのときによく起こりますが,今回はどうも違うようですね。。。
ひとまず,

xp_cmdshell に投げる bcp コマンドをどこかサーバーのローカルにリダイレクトして
実行結果のメッセージを見てみてはいかがでしょうか?

'bcp 〜 -U *** > c:\result.txt'
くさの
会議室デビュー日: 2005/06/02
投稿数: 4
投稿日時: 2005-06-02 19:56
返信ありがとうございます。

ストアドプロシージャの実行部分を以下のように変更し実行してみました。

EXECUTE master.dbo.xp_cmdshell 'bcp 〜 > c:\result.txt'

結果はc:\result.txtファイルが作成されませんでした。
同じコマンドをosqlでDBサーバのコマンドプロンプトにて実行すると
正常終了しているメッセージが出力されました。
(エクスポートファイルも正常に出力されました。)

.Netで実行しているので、ワーカープロセスに権限がない?と思いまして
ワーカープロセス自体に、OLAPの権限をつけてみました。
が、結果は同じで空のファイルが作成されました。

フォーマットファイルに、ワーカープロセスがリード権限をもっていない?
とも思いまして、フォーマットファイルにもAdministratorとASPNETの権限を
つけてみましたが、同じでした。

権限の問題だと思うのですが
誰に何の権限を与えるべきなのかが分からないです。

TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 20:23
引用:

くさのさんの書き込み (2005-06-02 19:56) より:

結果はc:result.txtファイルが作成されませんでした。
同じコマンドをosqlでDBサーバのコマンドプロンプトにて実行すると
正常終了しているメッセージが出力されました。
(エクスポートファイルも正常に出力されました。)

.Netで実行しているので、ワーカープロセスに権限がない?と思いまして
ワーカープロセス自体に、OLAPの権限をつけてみました。
が、結果は同じで空のファイルが作成されました。

フォーマットファイルに、ワーカープロセスがリード権限をもっていない?
とも思いまして、フォーマットファイルにもAdministratorとASPNETの権限を
つけてみましたが、同じでした。

権限の問題だと思うのですが
誰に何の権限を与えるべきなのかが分からないです。




SQLState などのほかの情報はどうなっていますでしょうか?

ちなみに,
fmt ファイルに触れない場合,

 SQLState = S1000,NativeError = 0
 ERROR = [Microsoft][ODBC SQL Server Driver] 一括コピーホストのデータファイルが開けません。

となります。

権限を与えるとしたら,xp_cmdshell は SQL Server のサービスアカウント経由でコマンドを実行しますので,こちらになりますかね。
しかし, osql で実行できていることから,問題ない気がします。

エクスポートパスも決めうちのようですし,不思議ですね。
くさの
会議室デビュー日: 2005/06/02
投稿数: 4
投稿日時: 2005-06-03 10:35
解決しました。

やったこと。
(1)fmtファイルがあるフォルダに、SQLサーバのログインユーザIDの権限を付加。
(2)SQLサーバのサービスを全て再起動。
→ファイル作成成功。

やはり、権限の問題でした。お騒がせいたしました。
TLC様、ありがとうございました。




くさの
会議室デビュー日: 2005/06/02
投稿数: 4
投稿日時: 2005-06-03 10:44
解決しました。

やったこと。
(1)fmtファイルがあるフォルダに、SQLサーバのログインユーザIDの権限を付加。
(2)SQLサーバのサービスを全て再起動。
→ファイル作成成功。

やはり、権限の問題でした。お騒がせいたしました。
TLC様、ありがとうございました。




TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-03 19:34
引用:

くさのさんの書き込み (2005-06-03 10:44) より:

やはり、権限の問題でした。お騒がせいたしました。




権限でしたか。
解決してよかったです。

こうなると,osql からキックの場合の権限コンテキストが気になりますね。
1

スキルアップ/キャリアアップ(JOB@IT)