我写了一个简单的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()
知道这里发生了什么吗?
答案 0 :(得分:2)
但目前尚不清楚为什么你这样做。在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_ACCESS
或UNSAFE
的程序集访问外部资源。尝试这样做并且没有出现错误表明它是允许的。虽然,目前还不清楚什么&#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的这个实例。