2011-04-01 53 views
8

我寫了一個簡單的UDF,它應該繪製圖形並將其保存在磁盤上。 實際上,我使用UDF作爲SQL SERVER和R之間的代理,所以UDF僅將R腳本通過DCOM從SQL SERVER傳遞到R引擎。一切工作正常,直到我嘗試繪製圖形或將其保存到磁盤。我用UNSAFE權限創建了程序集。 (D)COM SERVER - > UDF - >(D)COM服務器 - > UDF - > SQL引擎。從UDF訪問SQL Server CLR文件系統

所以,我的第一個問題是,我可以從UDF創建GUI嗎?我猜不是,但值得提問。

第二個問題是爲什麼具有UNSAFE權限的程序集無法訪問文件系統。我沒有收到任何錯誤,只是沒有任何反應。

R環境位於不同的地址空間,所以我沒有看到任何爲什麼SQL Engine for CLR的權限會影響它的原因。

感謝

編輯:

我試圖做同樣的事情的過程。現在創建一個空文件。這是我的R測試代碼:

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

任何想法這裏發生了什麼?

+0

我會運行SysInternals Filemon或進程監視器,並嘗試確定程序集在文件系統中要做什麼。使用其中一種工具可以獲得一些可見性。 – 2011-04-01 12:40:27

回答

2
  1. 無法實例從服務器端代碼
  2. 不安全的GUI是很危險的,EXTERNAL_ACCESS會更好,因爲它仍然允許文件系統訪問
  3. 如果沒有錯誤,有一個很好的機會,你的代碼正在正確運行,但它做的事情與你期望的不同;你可以添加一些調試代碼或附加一個調試器?
  4. 的過程是比較合適的比這兒的UDF因爲they are much more flexible

但目前還不清楚爲什麼你正在做的事情這樣。在SQL Server之外編寫一個小的(?)程序以從數據庫獲取數據,調用R程序並保存圖像可能會容易得多。 SQL Server中的服務器端代碼對於處理數據非常有用,但即使在使用CLR代碼時,通常與文件系統和外部資源進行交互也非常尷尬。

是否有任何特定的原因,你需要從SQL Server內部做到這一點?

+0

原因是我正在爲一個更大的項目做一個小型演示。想法是從ssms窗口做所有事情。我知道這是一種奇怪的方法,但我沒有其他選擇。此外,我需要不安全的權限,因爲一些非託管dll被加載。再次,這只是一個演示,所以我不擔心安全問題。我用Visual Studio的即時調試器與DLL和一切正常,所以我不認爲這個問題是在DLL代碼。明天我會盡我所能運用程序,但這可能是一個很長的過程。非常感謝您的回答。 – Klark 2011-04-01 16:32:06

+0

我更新了我的問題。請看看它 – Klark 2011-04-04 09:19:03

+1

@Klark爲什麼你有「沒有別的選擇」關於你如何運行你的演示?程序的輸出看起來是包含圖形的文件,所以SSMS只是一個錯誤的工具。爲什麼不寫一個外部程序並從你的演示文件的批處理文件中啓動它(如果你沒有時間去構建GUI)?我很抱歉沒有幫助,但是你以一種非常奇怪的方式做事,沒有任何明顯的原因。 – Pondlife 2011-04-07 14:32:56

1

要訪問文件系統,最好使用SSIS。您可以隨時編輯和測試軟件包,根據需要進行日誌記錄。您也可以在VisualStudio中輕鬆地將GUI添加到此包中。由於可能的安全問題,從DatabaseEngine訪問文件系統不是最佳實踐。

0

我的第一個問題是,我可以從UDF創建GUI嗎?

您可以使用System.Drawing創建和/或處理圖像,但:

  • 只有在大會的UNSAFE一個PERMISSION_SET
  • System.Drawing集加載到SQL Server中,如UNSAFE

第二個問題是,爲什麼與UNS組件AFE權限無法訪問文件系統。我沒有收到任何錯誤,只是沒有任何反應。

標記爲EXTERNAL_ACCESSUNSAFE的程序集允許訪問外部資源。試圖這樣做並且沒有得到一個錯誤表明它是被允許的。雖然,不清楚「什麼都沒有發生」的意思是因爲你有一個catch塊來「吞嚥」錯誤,或者該文件是在你不期待的目錄中創建的,因爲你使用的是相對路徑而不是絕對路徑路徑。

兩個問題(儘管他們綁在一起)與外部資源的訪問權限是:哪個/被用於該訪問的Windows Active Directory登錄

  • 。默認情況下,SQLCLR(就像xp_cmdshell)將在MSSQLSERVER進程的「登錄爲」帳戶的安全上下文下訪問系統。或者,假設登錄(在SQL Server中)與Windows/Active Directory帳戶相關聯,則您可以啓用模擬,這將假定執行SQLCLR代碼的人的安全上下文。 SQL Server登錄無法使用模擬。

  • 根據哪個帳戶訪問外部資源,他們對該資源的權限是什麼?如果是文件系統,該帳戶是否具有對指定路徑的寫入權限?

在給出的R實施例的術語(即創建C:\test1.jpg),並假設不被使用的是模擬:是否該帳戶,該MSSQLSERVER(或MSSQL $ {實例名})服務運行作爲有寫入權限到C:\?請記住,SQL Server正在運行的服務器的驅動器是C:驅動器,而不是本地計算機,除非您的計算機上正在運行SQL Server的此實例。