none
ストアド内からのbcpコマンドの実行について RRS feed

  • 質問

  • 環境:SQL Server 2008 Enterprise Edition

    ストアド内から、xp_cmdshellを利用して、
    bcpコマンドを実行しファイルへのデータ出力をしたいと考えています。

    接続にはSQL Server認証を利用します。
    そこで、bcpのコマンド実行時にSQLサーバへのログイン情報(ユーザ/パスワード)を
    記入することになるかと思いますが、ストアドの中にその情報を書きたくありません。

    何か良い方法がありませんでしょうか
    2010年2月8日 2:34

回答

  • こんにちは、
    希望としてはどの様に持ちたいのでしょうか?
    ちなみに下記の内どれかかなと思うのですが。
    1.ストアド内に直書き
    2.システム環境変数
    3.外出しのファイル(iniファイル等)に書いておいてそれを読み込む

    xp_cmdshellを用いてのbcpコマンド実行であれば、
    そのコマンド自体をbatファイルの外出しにしてしまうのは無しですかね。

    まあセキュリティ上よろしくないかと思いますが。

    2010年2月8日 6:54
  • batファイル外出しがありなのであれば、
    環境変数に接続情報を書き込むbatファイルを一つ用意しておいて
    各batファイルの頭でそのbatファイルを呼ぶのがいいと思いますよ。

    batコマンド中で環境変数に読み書きするだけであれば、
    ※hensuという環境変数名として
    読み %hensu%
    とすれば読めますし、
    書き SET  hensu = aaa
    とすれば書けますよね。

    そんな風にすれば接続情報を一つにまとめて
    コマンド実行も可能かと思いますよ。

    ※自分で言っといて何ですが、案2は実現できるかわかりません
    接続情報をファイルで持っておくのがありであれば、
    INIファイルよりもCSVファイルで持ってBUIL INSERTの方がレスポンス的に良い気もします。
    ちなみに、サンプルです。
    BEGIN
        DROP TABLE #TEMP
        CREATE TABLE #TEMP
             ( DATASOURCE     VARCHAR(100)
             , DATABASE_NAME  VARCHAR(100)
             , LOGON_USER     VARCHAR(100)
             , LOGON_PASSWORD VARCHAR(100)
             )
        BULK INSERT #TEMP FROM 'C:\access.txt'
        WITH(DATAFILETYPE    = 'char'
           , FIELDTERMINATOR = ','
           , ROWTERMINATOR   = '\n'
           )
        SELECT * FROM #TEMP
    END
    
    • 回答としてマーク 高橋 春樹 2010年2月15日 2:49
    • 回答としてマークされていない 空手家 2010年2月18日 13:27
    • 回答としてマーク 空手家 2010年2月18日 13:27
    2010年2月9日 13:10

すべての返信

  • こんにちは、
    希望としてはどの様に持ちたいのでしょうか?
    ちなみに下記の内どれかかなと思うのですが。
    1.ストアド内に直書き
    2.システム環境変数
    3.外出しのファイル(iniファイル等)に書いておいてそれを読み込む

    xp_cmdshellを用いてのbcpコマンド実行であれば、
    そのコマンド自体をbatファイルの外出しにしてしまうのは無しですかね。

    まあセキュリティ上よろしくないかと思いますが。

    2010年2月8日 6:54
  • aviator_さん

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

    > 1.ストアド内に直書き
    > 2.システム環境変数
    > 3.外出しのファイル(iniファイル等)に書いておいてそれを読み込む
    そうですね。私は「1」と「3」あたりを考えていました。
    「1」の場合:
    複数のストアドに接続情報を書かなければならない。=メンテが大変
    「2」の場合:
    この場合はどのように値を取得するという想定ですか?
    ストアド上から環境変数を読むという方法があるということでしょうか。
    「3」の場合:
    やはりこの方法かなとは考えてはいたのですが・・・。
    ただ、この場合、どうしてもiniファイルを解析する必要があると思いますので、
    ストアド上でiniファイルを解析するのは、処理的に大変ではないかと思いまして。

    > xp_cmdshellを用いてのbcpコマンド実行であれば、
    > そのコマンド自体をbatファイルの外出しにしてしまうのは無しですかね。
    >
    > まあセキュリティ上よろしくないかと思いますが。
    提案いただいた方法もありますね。
    ストアドにしても接続文字列を書かなければいけないとすると、batファイルに書いてしまっても
    同じかもしれませんね。

    ストアドからiniファイルを簡単に読み出せさえすれば、やはり「2」といったところでしょうか。
    2010年2月8日 15:32
  • batファイル外出しがありなのであれば、
    環境変数に接続情報を書き込むbatファイルを一つ用意しておいて
    各batファイルの頭でそのbatファイルを呼ぶのがいいと思いますよ。

    batコマンド中で環境変数に読み書きするだけであれば、
    ※hensuという環境変数名として
    読み %hensu%
    とすれば読めますし、
    書き SET  hensu = aaa
    とすれば書けますよね。

    そんな風にすれば接続情報を一つにまとめて
    コマンド実行も可能かと思いますよ。

    ※自分で言っといて何ですが、案2は実現できるかわかりません
    接続情報をファイルで持っておくのがありであれば、
    INIファイルよりもCSVファイルで持ってBUIL INSERTの方がレスポンス的に良い気もします。
    ちなみに、サンプルです。
    BEGIN
        DROP TABLE #TEMP
        CREATE TABLE #TEMP
             ( DATASOURCE     VARCHAR(100)
             , DATABASE_NAME  VARCHAR(100)
             , LOGON_USER     VARCHAR(100)
             , LOGON_PASSWORD VARCHAR(100)
             )
        BULK INSERT #TEMP FROM 'C:\access.txt'
        WITH(DATAFILETYPE    = 'char'
           , FIELDTERMINATOR = ','
           , ROWTERMINATOR   = '\n'
           )
        SELECT * FROM #TEMP
    END
    
    • 回答としてマーク 高橋 春樹 2010年2月15日 2:49
    • 回答としてマークされていない 空手家 2010年2月18日 13:27
    • 回答としてマーク 空手家 2010年2月18日 13:27
    2010年2月9日 13:10
  • こんにちは。フォーラムオペレーターの高橋春樹です。

    aviator_さん
    アドバイスの投稿、有難うございました。

    空手家さん
    MSDNフォーラムのご利用有難うございます。
    aviator_さんから追加情報を頂いたと思うのですが、如何でしょうか?
    空手家さんの現在の状況も気になるので、是非、abiator_さんの投稿に返信して頂きたいと思います。

    今回、aviator_さんの投稿が、有用な情報だと思いましたので、
    勝手ながら回答マークを付けさせてもらいました。

    尚、回答マークは問題解決を示すものではないので、何かしら情報がありましたら、ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2010年2月15日 2:55
  • >aviator_さん
    >高橋春樹さん

    ご回答ありがとうございます。
    BULKINSERTのサンプルスクリプトの提示、ありがとうございます。
    ぜひ参考にさせていただきたいと思います。
    2010年2月18日 13:26