Хранимая процедура и веб-служба SQL CLR - PullRequest
4 голосов
/ 15 апреля 2009

В настоящее время я работаю над задачей, в которой мне нужно вызвать метод в веб-службе из хранимой процедуры CLR.

Немного фона:

По сути, у меня есть задача, требующая ОЧЕНЬ хруста. Если все сделано строго в SQL, обработка занимает около 30-45 минут. Если я вставлю тот же процесс в код, я смогу завершить его за считанные секунды, благодаря возможности оптимизировать обработку намного более эффективно. Единственная проблема заключается в том, что мне нужно настроить этот процесс как автоматизированную задачу в SQL Server.

В этом ключе я представил процесс как веб-службу (я использую его и для других целей) и хочу, чтобы sproc SQL CLR использовал службу и выполнял код. Это позволяет мне иметь мою автоматизированную задачу.

Проблема:

Я прочитал довольно много разных тем о том, как использовать веб-сервис в CLR Sproc, и сделал это эффективно. Вот пример того, чему я следовал.

http://blog.hoegaerden.be/2008/11/11/calling-a-web-service-from-sql-server-2005/

Я могу заставить этот пример работать без проблем. Однако всякий раз, когда я связываю этот процесс с методом веб-службы, который включает в себя вызов базы данных, я получаю следующие исключения (в зависимости от того, перенесу я или нет в try / catch):

Сообщение 10312, уровень 16, состояние 49, процедура usp_CLRRunDirectSimulationAndWriteResults, строка 0 Выполнение .NET Framework было прервано. UDP / UDF / UDT не вернул токен потока.

или

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

Ошибка .NET Framework во время выполнения определенного пользователем подпрограмма или агрегат MyStoredProc:

System.Security.SecurityException: запрос на разрешение типа 'System.Security.Permissions.EnvironmentPermission, mscorlib, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 ' не удалось.

System.Security.SecurityException:

в System.Security.CodeAccessSecurityEngine.Check (Требование объекта, StackCrawlMark & ​​stackMark, Boolean isPermSet)

в System.Security.CodeAccessPermission.Demand ()

в System.Net.CredentialCache.get_DefaultCredentials ()

в System.Web.Services.Protocols.WebClientProtocol.set_UseDefaultCredentials (Boolean значение)

в MyStoredProc.localhost.MPWebService.set_UseDefaultCredentials (Boolean Value)

at MyStoredProclocalhost.MPWebService..ctor ()

в MyStoredProc.StoredProcedures.MyStoredProc (String FromPostCode, String ToPostCode)

Я уверен, что это проблема с разрешением, но я не могу, потому что жизнь меня заставляет работать. Я попытался использовать олицетворение в sproc CLR и некоторых других вещах. Какие-либо предложения? Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 19 июня 2009

Я просто выяснил это, но вот что я получил:

При создании сборки в SQL вам нужно задать значение UNSAFE для разрешения сборки.

CREATE ASSEMBLY [<assemblyname>] FROM '<path>/<assemblyname>.dll'
WITH PERMISSION_SET = UNSAFE
GO

Если для развертывания используется проект базы данных VS SQL, это также можно сделать, задав разрешение UNSAFE на вкладке базы данных свойств проекта базы данных.

0 голосов
/ 12 августа 2013

Вы должны проверить мой пост в блоге

Это турецкий, но вы можете перевести с помощью инструмента Google на странице. Представьте, что методы класса Agent будут вызывать ваш веб-сервис. И используйте в качестве примера зависимости System.Web вместо System.Management.

0 голосов
/ 16 августа 2011

Надеюсь проверить эту запись в блоге , которая поможет вам вызвать веб-сервис из хранимой процедуры SQL и преодолеть проблемы безопасности, с которыми вы столкнулись.

...