Sql-Server

嘗試執行通過 CLR 發布的儲存過程時遇到權限錯誤

  • July 17, 2019

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 程序集總是被標記以供進一步審查。這並不意味著您不應該這樣做,只是不應該有其他方式來完成所需的工作。

引用自:https://dba.stackexchange.com/questions/243063