Хранимая процедура SQLCLR получает ошибку «SecurityException: запрос разрешения типа« System.Data.OleDb.OleDbPermission » - PullRequest
0 голосов
/ 04 июля 2018

Я создал хранимую процедуру .NET SQLCLR, собрал и опубликовал ее на своем локальном сервере SQL.

В коде .NET я использую эту строку подключения:

OleDbConnection connection = new OleDbConnection(
      "provider=MSOLAP.7;data source=(local);initial catalog=AdventureWorksDW2014");

Этот код .NET содержит запрос на обновление куба. Таким образом, сборка должна обновить куб, размещенный на моем локальном сервере Analysis.

При выполнении хранимой процедуры SQLCLR в SSMS я получаю следующую ошибку:

Сообщение 6522, Уровень 16, Состояние 1, Процедура dbo.SqlStoredProcedure1, Строка 0

[Batch Start Line 0] Ошибка .NET Framework во время выполнения пользовательской подпрограммы или агрегата "SqlStoredProcedure1":
System.Security.SecurityException: Запрос на разрешение типа 'System.Data.OleDb.OleDbPermission, System.Data, версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 'не удалось. System.Security.SecurityException: в System.Security.CodeAccessSecurityEngine.Check (Требование объекта, StackCrawlMark & ​​stackMark, Boolean isPermSet) в System.Security.PermissionSet.Demand () в System.Data.Common.DbConnectionOptions.DemandPermission () в System.Data.OleDb.OleDbConnectionFactory.PermissionDemand (DbConnection externalConnection) в
System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal (DbConnection externalConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 повтор, DbConnectionOptions userOptions) в System.Data.ProviderBase.DbConnectionInternal.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory) в System.Data.OleDb.OleDbConnection.Open () в StoredProcedures.SqlStoredProcedure1 ()


По какой-то причине соединение OleDb не работает из сборки. Но при отладке из Visual Studio код работает отлично и обновляет куб.

Пожалуйста, поделитесь со мной потенциальными исправлениями вышеуказанной ошибки.

1 Ответ

0 голосов
/ 04 июля 2018

Вы получаете ошибку разрешения безопасности при попытке открыть соединение. Соединение является внешним (то есть не использует внутреннее «контекстное соединение»), поэтому сборка должна иметь PERMISSION_SET не менее EXTERNAL_ACCESS. Но для этого вам нужно подписать сборку (поскольку вы используете Visual Studio, это означает, что она должна иметь строгое имя), создать асимметричный ключ в master из этого ключа строгого имени, создать логин из этого Асимметричный ключ и предоставьте этому логину разрешение EXTERNAL ACCESS ASSEMBLY. Или, если вы используете SQL Server 2017 (или новее), то последний шаг изменится, и вы предоставите этому логину разрешение UNSAFE ASSEMBLY.

После выполнения этих шагов вы можете создать сборку WITH PERMISSION_SET = EXTERNAL_ACCESS или ALTER ASSEMBLY [{assembly_name}] WITH PERMISSION_SET = EXTERNAL_ACCESS;

Для получения подробных инструкций, в том числе о том, как автоматизировать это в Visual Studio, с возможностью заставить его работать в SQL Server 2017 и более поздних версиях и без использования внешних файлов, кроме сценария T-SQL, см. Следующие два сообщения: мой:

В решении 1 описывается, как этого добиться, если вы хотите полностью остаться в рамках ключа строгого имени / асимметричного ключа, используемого в Visual Studio. Решение 2 описывает менее сложный подход с использованием только сертификатов.

...