Sql-Server
嘗試執行通過 CLR 發布的儲存過程時遇到權限錯誤
我
SQL CLR c# stored procedure
在 Visual Studio 2017 中使用創建了一個儲存過程,並將其發佈在MSSQL Server
. 現在我可以看到我的儲存過程,但是當我想執行該過程時會遇到這個錯誤。錯誤是:消息 6522,級別 16,狀態 1,過程 cust_diff,第 0 行
$$ Batch Start Line 2 $$在執行使用者定義的常式或聚合“cust_diff”期間發生 .NET Framework 錯誤:
System.Security.SecurityException:
System.Security.Permissions.SecurityPermission System.Security.SecurityException:在 LevenshteinDistance.cust_diff()
我在 C# 程式碼的開頭添加了這兩個
using System.Security; using System.Security.Permissions;
這也是我用來創建程序的程式碼的一部分:
[Microsoft.SqlServer.Server.SqlProcedure] [PermissionSet(SecurityAction.Assert, Unrestricted = true)] public static void cust_diff() { // Put your code here LevenshteinDistance ld = new LevenshteinDistance(); ld.Method1(); }
但儘管使用了這兩個,我無法在 SSMS 中執行我的程序。
必須在數據庫上啟用此設置才能允許 CLR 過程執行。查詢應該顯示值為 1 的設置
SELECT name, CAST(value as int) as value_configured, CAST(value_in_use as int) as value_in_use FROM sys.configurations WHERE name ='clr enabled';
如果不是,則使用具有 dba 權限的登錄名執行此
EXECUTE sp_configure 'clr enabled',1; RECONFIGURE;
建議在創建程序集時標記它需要的訪問權限。從文件一個例子
CREATE ASSEMBLY SQLCLRTest FROM 'C:\MyDBApp\SQLCLRTest.dll' WITH PERMISSION_SET = SAFE;
訪問選項有 SAFE(限制最多)、EXTERNAL_ACCESS 和 UNSAFE(限制最少)。標記程序集的內容取決於它訪問的內容以及資源所在的位置。
如果您的程序集需要外部或不安全訪問,例如訪問本地數據或本機程式碼的能力,那麼您還需要執行以下任一操作:
- 該程序集使用證書籤名,並具有外部訪問程序集或不安全程序集權限的登錄。這是首選,因為它將權限限制在最低級別:一個使用者
- 數據庫所有者俱有外部訪問組件或不安全組件
從使用 CIS 標準的安全審計角度來看,CLR 程序集總是被標記以供進一步審查。這並不意味著您不應該這樣做,只是不應該有其他方式來完成所需的工作。