【发布时间】:2011-06-17 23:14:01
【问题描述】:
我正在创建一个代码库,该代码库将部署在企业环境中的数十个 Sql Server 上。 SQL Server 的版本大多是 2008,但也存在一些 2000、2005 和 2008R2 实例。这些也运行在各种版本的 Windows server 2000-2008 上。我需要能够找到要从该库的 C#.NET 代码中调用的 BCP 的 Sql Server 版本。
我不能依赖默认安装目录,因为许多服务器没有在默认目录位置安装 Sql Server。
我也不能依赖 PATH 变量,因为这些服务器中的许多还安装了 Sybase 驱动程序,它有自己的 BCP 版本(不支持我们使用的许多 BCP 调用的 queryout 命令),我们依赖 PATH 环境变量返回 Sybase 位置而不是 Sql Server 位置时遇到了问题。
鉴于这些不同的版本和限制,谁能提出一个解决方案,让我可以轻松地在这些服务器上找到 BCP 的位置?
编辑:
我曾考虑过使用 SQLBulkCopy,但这是为了支持跨大量数据库和存储过程的大量现有 BCP 调用。现在他们都调用了一个现有的存储过程,该存储过程存在于每个服务器上的一个公共数据库中,并且在该存储过程中,一个模拟调用然后使用其提升的权限来调用 xp_cmdshell。出于安全原因,我们想去掉 xp_cmdshell 部分。我们希望将其替换为 CLR 存储过程,该过程会找到 BCP,然后传入参数,这样人们就无法使用该过程来访问 cmd shell。
BULK INSERT 在我们的环境中也不起作用,因为安全权限的设置方式很奇怪,并且由于某种原因他们还没有弄清楚,BCP 无法处理不在同一物理上的文件位置盒子。此外,我们的大多数 BCP 调用都是创建文件,而不是导入它们。
【问题讨论】:
标签: .net sql-server bcp