Триггер SQL CLR, как сделать сборку доверенной из-за прозрачного кода вызова критического кода?

Я погрузился в исследование SQL CLR. К сожалению, мой первый пример имеет проблему с прозрачный код вызова код.

дело в том, что мой триггер SQL CLR обрабатывается как прозрачный код. И в триггере я использую Quartz для вызова службы Quartz Windows:

var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "ServerScheduler";

properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = string.Format("tcp://{0}:{1}/{2}", "localhost", "555",
                "QuartzScheduler");

var schedulerFactory = new StdSchedulerFactory(properties);

IScheduler scheduler = schedulerFactory.GetScheduler();

ошибка:

(135,1): SQL72014: .Net поставщик данных SqlClient: Msg 6522, Уровень 16, Состояние 1, Процедура AfterMarketSessionInserted, Строка 1 A .net Framework ошибка при выполнении пользовательской подпрограммы или aggregate "AfterMarketSessionInserted": System.Класса methodaccessexception: попытка по безопасности прозрачный метод '.База данных.Провоцирующие факторы.MarketSessionTriggers.AfterMarketSessionInserted ()' для доступа к критическому методу безопасности 'кварца.Impl.StdSchedulerFactory..ctor (System.Коллекции.Специализированный.Namevaluecollection, который)' не удалось.

база данных сборки, версия=1.0.5275.15169, культура=нейтральная, PublicKeyToken=null ' является частично доверенным, что приводит к CLR сделайте его полностью прозрачным, независимо от прозрачности аннотации в самой сборке. для доступа к безопасности критический код, этой сборке необходимо полностью доверять. Система.MethodAccessException: at База данных.Провоцирующие факторы.FinancialMarketSessionTriggers.AfterFinancialMarketSessionInserted ()

--------------

почему код триггера SQL CLR считается прозрачным кодом и частично доверенным?

Как сделать код триггера SQL CLR не прозрачным кодом или сделать его доверенным полностью?

Я открыт для suggesstions.

2 ответов


почему код SQLCLR доверяется только частично?

по умолчанию код среды CLR, запущенный внутри SQL Server (т. е. "SQLCLR"), сильно ограничен, чтобы не ухудшить безопасность или стабильность SQL Server.

как сделать SQLCLR полностью доверенным?

то, что код среды CLR в сборке может делать, контролируется (в основном)PERMISSION_SET свойство каждой сборки. Если вы не укажете PERMISSION_SET при загрузке Сборка через CREATE ASSEMBLY по умолчанию будет SAFE, который является наиболее ограниченным и не полностью доверять. Чтобы код среды CLR мог выходить за пределы SQL Server (в сеть, файловую систему, ОС и т. д.) вам нужно будет установить сборку по крайней мере EXTERNAL_ACCESS, но это еще не полностью доверять. Для того, чтобы считаться полностью доверял вам нужно установить сборку UNSAFE.

для установки любой сборки в либо EXTERNAL_ACCESS или UNSAFE, вам нужно сделать одно из следующих действий:

  • набор данных, содержащая собрание благонадежные = на. Это предполагает, что владелец базы данных имеет UNSAFE ASSEMBLY разрешение уровня сервера (что обычно имеет место). Хотя этот вариант быстрее / проще, он не является предпочтительным из-за TRUSTWORTHY = на будучи довольно широко открытой дырой безопасности.
  • подпишите сборку паролем, создайте асимметричный ключ из сборки, создайте логин из асимметричного ключа, предоставьте логин UNSAFE ASSEMBLY разрешения. Это предпочтительный метод.

если вы хотите более подробно взглянуть на безопасность SQLCLR, особенно в отношении того, насколько ограничены безопасные сборки, проверьте это статьи что я написал на SQL Server Central (для чтения статей на этом сайте требуется бесплатная регистрация).


некоторые дополнительные сведения: если вы выбираете предпочтительный метод подписи сборки и создания асимметричного ключа, см. Это статья MSDN

приведенный ниже фрагмент SQL взят из вышеупомянутой статьи. В базе данных Master создайте ключ и логин:

USE master; 
GO  

CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';   
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;  
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;
GO

затем создайте сборку:

CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;