2011-05-20 64 views
1

有沒有辦法在SQL Server中動態更改CLR過程的代碼?如何在SQL Server中的clr存儲過程中執行動態.net代碼

假設您有一個裝配了MS SQL Server 2008 R2中部署的業務邏輯。這個程序集(或程序集)正在不斷使用(例如,爲多個併發查詢中的每一行調用一些函數)。所以你不能放棄組裝。有沒有辦法改變我的業務邏輯的動態或某種方式來執行外部可變碼?

我已經探討了這些方法,但沒有工作:

  1. Reflection.Emit的
  2. Mono.Cecil能
  3. 在部署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這樣的提示沒有幫助。

+1

所以你很樂意繞過任何正式的發佈流程?這就是你有CLR的原因嗎? – gbn 2011-05-20 14:13:51

+0

@gbn問題不在於發佈過程:我希望能夠通過GUI動態設置一些安全規則。例如,一些用戶應該只能看到沒有他們的地址或去年的交易等的客戶。規則並不複雜,但幾乎每天都會改變,我們不能把它們放在代碼中。其餘業務邏輯在TSQL中實現。由於性能問題而選擇CLR(動態SQL太慢)。還有另一種選擇:生成聚集視圖(在WHERE部分有規則),但速度不夠快。 – Dima 2011-05-22 14:12:47

+0

這在你的問題中並不明顯...... – gbn 2011-05-22 14:13:53

回答

0

有動態評估算術表達式一個好的圖書館(帶參數) - Flee

在我來說,我沒有執行任何代碼 - 就像「日期表達式>‘20100101’或狀態= 2「,所以Flee幾乎完全滿足。唯一的問題是它的邏輯運算符不能用於SqlBoolean類型(在sql表達式中使用),但添加此功能並沒有什麼大不了的。

但是在一般情況下,似乎不可能在Sql Server主機內執行動態.Net代碼。

+1

這是不可能的,因爲Reflection.Emit被主機保護屬性阻止。請參閱http://msdn.microsoft.com/en-us/library/ms403285.aspx – 2011-05-30 09:13:17

1

我不是一個CLR程序集專家,但明顯的選項是:

  1. ALTER ASSEMBLY
  2. 刪除並重新創建裝配交易
  3. 內定義一個維護窗口和部署那麼

gbn關於發佈過程的觀點是一個很好的觀點。如果您的程序(以及您的業務運營)確實在全天候運行,那麼您可能已經擁有某種形式的系統冗餘,併爲修補和升級應用程序建立了維護程序?如果是這樣,只需在日常維護窗口中部署新代碼即可。

+0

在修改了這個想法後,我發現在極少數情況下需要重新部署,所以我們可以在沒有人連接時執行(應用程序不是全天候運行)。 @Pondlife,@gbn你是對的:問題是關於發佈過程(但它被遮擋了) – Dima 2011-05-23 13:38:28