[MS-SQL]SQL CLR 應用及問題處理

  • 395
  • 0

我將SQL CLR應用在使用Store Procedure,透過SQL CLR應用,使用 .NET程式,動態取得短網址,將一些遇到的問題記錄起來。

如果想要知道如何使用的話,可以參考SQL CLR初體驗,利用CLR撰寫SQL Function處理計算公式並回傳計算結果 ,寫得非常詳細。

 

T-SQL 跟 .NET 使用時機

  • 適合用物件導向或是複雜或重運算的邏輯,適合用 .NET
  • 大量更新或是資料庫處理相關的,適合用T-SQL

組件權限

  • SAFE:只有最少的權限可以執行,不可存取外部資源與外部程式碼。
  • EXTERNAL_ACCESS:可以存取外部資源,像是檔案、登錄資料庫、網路資源等。
  • UNSAFE:可以無限制的存取外部資源,連 Win32 API 等都可以呼叫。

遇到問題

權限要求失敗

錯誤訊息

    類型 'System.Net.WebPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的使用權限要求失敗。
   於 System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   於 System.Security.CodeAccessPermission.Demand()
   於 System.Net.HttpWebRequest.CheckConnectPermission(Uri uri, Boolean needExecutionContext)
   於 System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
   於 System.Net.HttpRequestCreator.Create(Uri Uri)
   於 System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
   於 ShortenUrl.GoogleUrlShortener.Shorten(String url)

解決方法

  • 組件的屬性設定

  • 將權限集合改成外部存取 OR 不受限制

無法改變組件權限

錯誤訊息

master 資料庫中記錄的資料庫擁有者 SID 與資料庫 'TYSAFE' 中記錄的資料庫擁有者 SID 不同。
您應該使用 ALTER AUTHORIZATION 陳述式重設資料庫 'TYSAFE' 的擁有者,以更正這個狀況。
(Microsoft SQL Server, 錯誤: 33009)

解決方法

  • 使用最高權限使用者,調整資料庫擁有者

※要記住原本的擁有者,因為後面需要調整回來

  • 將組件新增進去
  • 將資料庫擁有者設定回原本的

參考資料

SQL CLR初體驗,利用CLR撰寫SQL Function處理計算公式並回傳計算結果
開發篇-當SQL遇上.NET