有沒有辦法在SQL Server中動態更改CLR過程的代碼?如何在SQL Server中的clr存儲過程中執行動態.net代碼
假設您有一個裝配了MS SQL Server 2008 R2中部署的業務邏輯。這個程序集(或程序集)正在不斷使用(例如,爲多個併發查詢中的每一行調用一些函數)。所以你不能放棄組裝。有沒有辦法改變我的業務邏輯的動態或某種方式來執行外部可變碼?
我已經探討了這些方法,但沒有工作:
- Reflection.Emit的
- Mono.Cecil能
- 在部署SQL Server中的組件加載外部組件
更新: 這個問題不是關於發佈過程:我想能夠通過GUI動態設置一些安全規則。
例如,某些用戶應該只能看到沒有他們的地址或上一年內的交易等的客戶。
規則並不複雜,但它們幾乎每天都會改變,我們不能將它們放在代碼中。其餘業務邏輯在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.Transa然後加入vw_Transactions,但先加入並過濾(這絕對不可取)。像FORCE ORDER這樣的提示沒有幫助。
所以你很樂意繞過任何正式的發佈流程?這就是你有CLR的原因嗎? – gbn 2011-05-20 14:13:51
@gbn問題不在於發佈過程:我希望能夠通過GUI動態設置一些安全規則。例如,一些用戶應該只能看到沒有他們的地址或去年的交易等的客戶。規則並不複雜,但幾乎每天都會改變,我們不能把它們放在代碼中。其餘業務邏輯在TSQL中實現。由於性能問題而選擇CLR(動態SQL太慢)。還有另一種選擇:生成聚集視圖(在WHERE部分有規則),但速度不夠快。 – Dima 2011-05-22 14:12:47
這在你的問題中並不明顯...... – gbn 2011-05-22 14:13:53