私は大きな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は必要ありません。私が知りたいと思っていることの大部分はパワーシェルに関するものです。
アドバイスありがとうございます。データエクスポート用
これは管理タスクではありません。それはワークフローの一部です。 t-sqlコードでPowerShellスクリプトを呼び出せますか? – Marcin
もちろん... 'xp_cmdshell Powershell -File script.ps1'。またエージェント内から:https://msdn.microsoft.com/en-us/library/hh213688.aspx – majkinetor
それは私が行きたい方法ではありません。 私はxp_cmdshellを取り除く必要があります。 – Marcin