从UDF访问Sql Server CLR文件系统

时间:2011-04-01 09:35:41

标签: sql-server r clr user-defined-functions sqlclr

我写了一个简单的UDF,应绘制图形并将其保存在磁盘上。 实际上,我使用UDF作为SQL SERVER和R之间的代理,因此UDF只通过DCOM将R脚本从SQL SERVER传递给R引擎。一切正常,直到我尝试绘制图形或将其保存到磁盘。我使用UNSAFE权限创建了程序集。

所以,它是这样的: SQL引擎 - > UDF - > (D)COM服务器 - > R - > (D)COM服务器 - > UDF - > SQL引擎。

所以,我的第一个问题是,我可以从UDF创建GUI吗?我想不是,但值得一提。

第二个问题是,为什么具有UNSAFE权限的程序集无法访问文件系统。我没有收到任何错误,只是没有任何反应。

R环境位于不同的地址空间中,因此我没有看到SQL引擎对CLR的权限会影响它的任何原因。

谢谢

修改

我尝试用程序做同样的事情。现在创建一个空文件。这是我的R测试代码:

jpeg("C:\\test1.jpg"); x <- rnorm(100); hist(x); dev.off()

知道这里发生了什么吗?

3 个答案:

答案 0 :(得分:2)

  1. 您无法从服务器端代码
  2. 实例化GUI
  3. UNSAFE很危险,EXTERNAL_ACCESS会更好,因为它仍允许文件系统访问
  4. 如果没有错误,您的代码很可能正常运行,但它正在执行与您预期的不同的操作;你可以添加一些调试代码或附加调试器吗?
  5. 此处的过程比UDF更合适,因为they are much more flexible
  6. 但目前尚不清楚为什么你这样做。在SQL Server外部编写一个小(?)程序以从数据库中获取数据,调用R程序并保存图像可能要容易得多。 SQL Server中的服务器端代码非常适合处理数据,但即使使用CLR代码,也很难与文件系统和外部资源进行交互。

    您是否需要在SQL Server中执行此操作?

答案 1 :(得分:1)

要访问文件系统,最好使用SSIS。您可以随时编辑和测试包,并在需要时进行记录。您还可以轻松地将VisualStudio中的GUI添加到此包中。由于可能存在安全问题,从DatabaseEngine访问文件系统不是最佳实践。

答案 2 :(得分:0)

  

我的第一个问题是,我可以从UDF创建GUI吗?

您可以使用System.Drawing创建和/或操作图片,但是:

  • 仅当大会有PERMISSION_SET UNSAFE
  • 您将System.Drawing程序集加载到SQL Server中,作为UNSAFE
  

第二个问题是,为什么具有UNSAFE权限的程序集无法访问文件系统。我没有收到任何错误,只是没有任何反应。

允许标记为EXTERNAL_ACCESSUNSAFE的程序集访问外部资源。尝试这样做并且没有出现错误表明它是允许的。虽然,目前还不清楚什么&#34;什么都没发生&#34;意思是因为你有一个catch阻滞是&#34;吞咽&#34;错误,或者文件是在您不期望的目录中创建的,因为您使用了相对路径而不是绝对路径。

外部资源访问的两个问题(尽管它们捆绑在一起)是:

  • 正在使用哪种Windows / Active Directory登录进行访问。默认情况下,SQLCLR(就像xp_cmdshell)将在&#34; Log On As&#34;的安全上下文中访问系统。帐户 MSSQLSERVER 进程。或者,您可以启用模拟,该模拟将假定执行SQLCLR代码的人的安全上下文,假设Login(在SQL Server中)与Windows / Active Directory帐户相关联。 SQL Server登录不能使用模拟。

  • 根据访问外部资源的帐户,他们对该资源的权限是多少?如果它是文件系统,该帐户是否具有指定路径的写入权限?

就给定的R示例而言(即创建C:\test1.jpg),并假设未使用模拟: MSSQLSERVER (或 MSSQL $ { InstanceName} )服务运行具有对 C:\ 的写入权限?请记住,这是运行SQL Server的服务器的 C:驱动器,而不是本地计算机,除非您的计算机上运行了SQL Server的这个实例。