0

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

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

我发现这会产生错误:

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

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

:!! dir

这也失败了:

SQL72007:语法检查失败“附近的语法不正确。” 在批次附近:':!!目录

当我尝试时它失败了:

!! dir

我能够执行以下命令:

:r .\myfile.sql 

我注意到每当我这样做时都会发生以下错误:!!

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

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

4

1 回答 1

5

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

出于同样的原因,该sqlcmd.exe命令允许使用命令行选项禁用:!!和命令。:ed-X

如果您确实需要在脚本中运行操作系统命令,您仍然可以回退到xp_cmdshell,这当然也有问题,但至少服务器的管理员可以决定是否应该允许它。

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

于 2013-02-22T18:07:07.573 回答