Как выполнить динамический код .net в хранимой процедуре clr в SQL Server - PullRequest
1 голос
/ 20 мая 2011

Есть ли способ динамически изменить код процедуры CLR в SQL Server?

Предположим, у вас есть сборка с вашей бизнес-логикой, развернутая в MS SQL Server 2008 R2. Эта сборка (или сборки) используется постоянно (например, вызывая некоторые функции для каждой строки таблицы в нескольких параллельных запросах). Так что вы не можете просто бросить сборку. Есть ли способ изменить мою бизнес-логику динамически или каким-либо образом выполнить внешний изменяемый код?

Я уже исследовал эти подходы, но ни один из них не работал:

  1. Reflection.Emit
  2. Mono.Cecil
  3. Загрузка внешней сборки в сборку, развернутую в SQL Server

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

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

Правила не сложны, но они могут меняться почти каждый день, и мы не можем поместить их в код. Остальная часть бизнес-логики реализована в TSQL. CLR был выбран из-за проблемы с производительностью (динамический SQL слишком медленный).

Был еще один вариант: генерировать кластерные представления (с правилами в разделе WHERE), но это было недостаточно быстро.

Некоторые подробности:

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

select *
from dbo.Transactions
where ... --filters from your business logic

Если мы хотим отфильтровать результат, чтобы показать разрешенные строки, мы можем сгенерировать некоторое индексированное представление и объединить его с результирующим набором, подобным этому:

select *
from dbo.Transactions t
inner join dbo.vw_Transactions v
on t.id = v.id
where ... --filters from your business logic

Но если мы проверим план выполнения, в большинстве случаев анализатор запросов решит не фильтровать dbo.Transaction, а затем присоединиться к vw_Transactions, но сначала присоединиться и отфильтровать позже (что совершенно нежелательно). Подсказки типа FORCE ORDER не помогают.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Я не эксперт по сборке CLR, но очевидные варианты:

  1. ALTER ASSEMBLY
  2. Удалить и заново создать сборку внутри транзакции
  3. Определите окно обслуживания и разверните его, затем

Замечание gbn о процессах выпуска является хорошим. Если ваши процедуры (и, следовательно, ваши бизнес-операции) действительно постоянно работают круглосуточно, то, вероятно, у вас уже есть какая-то форма избыточности системы и установленные процедуры обслуживания для исправления и обновления приложений? Если это так, просто разверните новый код в обычном окне обслуживания.

0 голосов
/ 30 мая 2011

Есть хорошая библиотека для динамической оценки арифметического выражения (с параметрами) - Flee

В моем случае мне не нужно было выполнять любой .Net-код - только выражения типа «Дата> 20100101» или «Статус = 2», так что Flee удовлетворяет почти полностью. Единственная проблема заключается в том, что его логические операторы не работают с типом SqlBoolean (который используется в выражениях sql), но добавить эту функцию не составляет особого труда.

Но в общем случае кажется невозможным выполнить динамический код .Net внутри хоста Sql Server .

...