SQL xp_cmdshell在服务器之间复制文件

时间:2012-10-05 07:09:43

标签: sql sql-server sql-agent-job xp-cmdshell

我正在尝试将特定文件夹中的所有.zip移动到另一个文件夹。源文件夹位于另一台服务器上,目前我正在使用

EXECUTE xp_cmdshell 'copy \\server1\e$\ETL\*.zip \\server2\e$\ETL\'
GO

如果我登录到两个服务器,哪个有效,但目标是自动化此过程VIA sql server作业代理。我试过了

EXECUTE sp_xp_cmdshell_proxy_account 'domain\useracc','pass'
GO
EXECUTE xp_cmdshell 'copy \\server1\e$\ETL\*.zip \\server2\e$\ETL\'
GO

但我收到以下错误;

  
    

执行sp_xp_cmdshell_proxy_account期间发生错误。可能的原因:提供的帐户无效或无法创建“## xp_cmdshell_proxy_account ##”凭据。错误代码:'0'。

  

也不确定这是否是我的解决方案。请帮助我如何实现这一目标。 server1上的文件名每天都会更改名称和数量。

2 个答案:

答案 0 :(得分:2)

我强烈建议......不要使用xp_cmdshell。它会在您的表面区域打开大型安全整体,让您容易受到攻击。应该禁用xp_cmdshell!

相反,如果您想使用服务器代理自动执行此操作,则有2个选项。我的首选是编写一个带有文件系统任务的简单SSIS包,并使用服务器代理安排此包。 SSIS没有充分利用这种任务,但实际上相当不错。

或者重写您的脚本以使用Server Agent CmdExec作业步骤。这不需要启用xp_cmdshell并减少攻击面。

答案 1 :(得分:2)

我发现以下内容对我有用;

  
      
  1. 在命令提示符下,键入services.msc,这将打开服务器上所有服务的列表。

  2.   
  3. 在服务列表中,查找SQL Server代理,右键单击 - >属性。转到登录选项卡

  4.   

将登录更改为在两台服务器上都具有访问权限的用户。然后重新编写脚本以使用Server Agent CmdExec作业步骤(谢谢Pete Carter)