我將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)
解決方法
- 使用最高權限使用者,調整資料庫擁有者
※要記住原本的擁有者,因為後面需要調整回來
- 將組件新增進去
- 將資料庫擁有者設定回原本的