SQL Server数据库项目:为什么不支持命令执行

时间:2013-02-22 16:56:47

标签: sql sql-server visual-studio tsql

我正在尝试在Visual Studio SQL数据库项目的预部署脚本中复制文件。

:!!copy $(DataFileDirectory)\data.csv $(DataDestinationDirectory)

我发现这产生了错误:

  

SQL72007:语法检查失败'语法不正确'。在批次附近:':!! copy

所以我尝试简化测试并尝试:

:!! dir

这也失败了:

  

SQL72007:语法检查失败'语法不正确'。在批次附近:':!! DIR

我尝试时失败了:

!! dir

我可以执行如下命令:

:r .\myfile.sql 

我注意到每当:!!

发生以下错误
  

72006:致命脚本错误:不支持命令执行。

为什么命令执行(:!!)不受支持?!

1 个答案:

答案 0 :(得分:4)

当然,这只能由SSDT的设计者真正回答,但你可以做出有根据的猜测:它会过多地损害系统安全性。它允许您在运行SQL Server本身的用户帐户下在数据库服务器的操作系统上运行任意命令。

sqlcmd.exe命令允许用:!!:ed命令禁用-Xxp_cmdshell命令,原因相同。

如果你真的需要在你的脚本中运行OS命令,你仍然可以回退到:r,这当然也有问题,但至少服务器的管理员可以决定是否允许它。

还有更多SQLCMD语法选项,SSDT前后部署脚本不支持(例如:connect:on error)。因此,另一种解释是,出于部署脚本的目的,:setvar和{{1}}命令被认为是足够的。