2016-04-04 6 views
1

私は大きなt-SQLベースのアプリケーションを管理しています。 xp_cmdshellを介して呼び出されるbcpの使用法はたくさんあります。xp_cmdshellの呼び出しをt-sqlコードから削除するにはどうすればいいですか

xp_cmdshellにはSQL Serverサービスアカウントと同じセキュリティコンテキストがあり、作業に必要以上のものがあるため、問題があります。

私の最初のアイデアは、この不利益を取り除くためにCLRコードを使用することです。 CLRは、コードを呼び出したユーザーの権限で実行されています。 以下の手順を作成しても問題ありません。私はそれがこのコードを実行しているアカウントの権限を使っていることがわかります。私は、BCPの呼び出し(引数が同じである)でめちゃくちゃないよので

public static void RunBCP(SqlString arguments, out SqlString output_msg, out SqlString error_msg, out SqlInt32 return_val) { 
     output_msg = string.Empty; 
     error_msg = string.Empty; 
     try { 
      var proc = new Process { 
       StartInfo = new ProcessStartInfo { 
        FileName = "bcp", 
        Arguments = arguments.ToString(), 
        UseShellExecute = false, 
        RedirectStandardOutput = true, 
        CreateNoWindow = true 
       } 
      }; 
      proc.Start(); 
      while (!proc.StandardOutput.EndOfStream) { 
       output_msg += proc.StandardOutput.ReadLine(); 
      } 
      return_val = proc.ExitCode; 
     } 
     catch (Exception e) { 
      error_msg = e.Message; 
      return_val = 1; 
     } 
    } 

は、これは良い解決策です。ロジックに大きな変更はなく、エラーのリスクはありません。

declare @ReturnCode int; 
declare @cmd varchar(1000); 
SELECT @CMD = '"select FirstName, LastName, DateOfBirth" queryout "c:\temp\OutputFile.csv" -c -t -T -S"(local)"' 
exec DataBase.dbo.up_RunBCP @arguments = @cmd; 

だから、質問は次のとおりです:

declare @ReturnCode int; 
declare @cmd varchar(1000); 
SELECT @CMD = 'bcp "select FirstName, LastName, DateOfBirth" queryout "c:\temp\OutputFile.csv" -c -t -T -S"(local)"' 
EXEC @ReturnCode=xp_cmdshell @CMD,no_output 

は今、私はこのようにそれを呼び出す:他の方法があるT-SQLでのBCPの

そのため、以前の呼び出しは、この方法を探していましたxp_cmdshellのbcpコードを取り除くには? PowerShell(sqlps)を使用できると聞きました。しかし、私が見つけた例は、PowerShellスクリプトを作成することを提案しています。 t-sqlコードからこのようなスクリプトを呼び出すことはできますか? このコード(powershellスクリプト)の保存方法は?データベースオブジェクトとして? または別の方法がありますか? SSISは必要ありません。私が知りたいと思っていることの大部分はパワーシェルに関するものです。

アドバイスありがとうございます。データエクスポート用

答えて

0

あなたのオプションは次のとおりです。

  • bcp.exeの呼び出すためにxp_cmdshellを使用して - バルクコピー
  • の古い道CLRを使用して - バルクコピー
  • SSISの新しい道を - これを行うための私の好みの方法; here is the example
  • INSERT INTO OPENROWSET - テキスト/ Jet/32ビット環境のいずれかのドライバがインストールされている場合、または64ビットドライバ(たとえば、64ビットODBCテキストドライバ、
  • SQL Serverのインポート/エクスポートウィザード - 欲しい方法ではほとんど動作しない醜い手動方法
  • 外部CSVテーブルを使用する - まだサポートされていません(SQL Server 2016はそれを約束します...)

HTH

0

私はこれを行う簡単なPowerShellスクリプトを使用することになり、何かのように:

Invoke-SqlCommand -query '...' | ExportTo-Csv ... 

は一般的に、管理機能のためにあなたは、タスクスケジューラにこれを追加することができ、それを使って行うこと。必要に応じてこのタスクを実行する必要がある場合は、を使用してschtasks.exe run Task_NAMEを使用して実行することができます。これはPowershellでT-SQLで表現する方が簡単なためです。

他に言及されているものはすべて、余分なツール(SSISにはVSが必要)が必要です。これは依存性のないポータブルです。

xp_cmdshellなしでスクリプトを呼び出すには、powershellステップを使用してジョブを作成し、t-sql内から実行する必要があります。

+0

これは管理タスクではありません。それはワークフローの一部です。 t-sqlコードでPowerShellスクリプトを呼び出せますか? – Marcin

+0

もちろん... 'xp_cmdshell Powershell -File script.ps1'。またエージェント内から:https://msdn.microsoft.com/en-us/library/hh213688.aspx – majkinetor

+0

それは私が行きたい方法ではありません。 私はxp_cmdshellを取り除く必要があります。 – Marcin

関連する問題