Есть ли способ динамически изменить код процедуры CLR в SQL Server?
Предположим, у вас есть сборка с вашей бизнес-логикой, развернутая в MS SQL Server 2008 R2. Эта сборка (или сборки) используется постоянно (например, вызывая некоторые функции для каждой строки таблицы в нескольких параллельных запросах). Так что вы не можете просто бросить сборку. Есть ли способ изменить мою бизнес-логику динамически или каким-либо образом выполнить внешний изменяемый код?
Я уже исследовал эти подходы, но ни один из них не работал:
- Reflection.Emit
- Mono.Cecil
- Загрузка внешней сборки в сборку, развернутую в 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 не помогают.