2012-09-25 86 views
5

我們環境中的數據庫正在被2個不同的環境/應用程序共享。 在2個應用程序中,第一個-lets說A,經常更新,而第二個應用程序B沒有經常更新。如何使用同一數據庫處理來自多個應用程序的存儲過程代碼更改?

所以這裏的情況是當應用程序在獲得新的代碼,主要存儲過程更新,它有時會影響並打破2日申請B,正由另一隊更新,不更新過於頻繁。 我明白,這不應該是正確的方式來處理它,而不是更新兩個環境可能是災難性的。 這是因爲應用程序A & B正在由不同的團隊處理。

你會如何優雅地處理這種情況?

從應用B我可以採取的預防措施是 - 在代碼 檢索數據 - 的最好辦法,而檢索數據將檢查空/空列,因此,如果新列由應用程序A補充說,他們可以被應用程序B忽略。 在SQL中檢索數據 - 在該過程中,可以使用可選參數進行處理。

但當C#代碼調用一個過程,我們應該被路過的PARAM值,如果有添加了新的參數,然後將其打破。 有沒有辦法確保如果調用參數丟失,那麼它應該被忽略(從C#或SQL Server)?

我的研究表明 -

  1. ,我可以取回從存儲過程的第一個參數列表,然後通過調用使用列表循環過程,並檢查是否帕拉姆存在。 因此,即使應用程序A添加了新的參數,它也可以由應用程序B自動處理。 這可以使用C#中的DeriveParameters或SQL查詢來獲得參數列表。

  2. 更改所有存儲過程採取一個CSV形式參數。並將它們分成SPROC並相應地使用它。 這聽起來對於數百個現有sprocs來說是跛腳的。

同樣,正如我所說的 - 這是does not看起來像一個很好的解決方案,如果你也有類似的情況下,如何不同,你會怎麼處理呢? 有沒有框架,我不知道哪些可以解決這種情況?

環境 - ASP.NET/C# 4.0,SQL Server 2008 R2的

編輯 - 讓我改一下,在這裏提供一些更多的細節。

  1. 應用/ A隊改變了代碼,但只有C#代碼將被推廣到生產還沒有,而不是數據庫的變化。 這是不同的地方。數據庫代碼只能在下一個版本中使用。

  2. 應用/ B隊擁有最新的代碼,但DB的變化是不是在生產着呢,仍然使用舊的數據庫。

+0

根據迄今爲止發佈的3個答案,由於問題是共享數據庫,所以最好在數據庫中創建解決方案,而不是在使用它的應用程序中。 –

+0

你最終安排了與其他團隊做什麼的協議? –

回答

2

是否有理由不能將默認值分配給新參數?例如

CREATE PROCEDURE xxx 

    @OldParam int 
    ,@NewParam int = 0 

AS 

    <etc> 

應用程序「A」傳入兩個參數。

當proc只有一個參數時,應用程序「B」被寫入,並且只用一個重要的參數調用它。使用新版本時,第二個參數將不會被傳遞,因此它會讀取默認值0 ...並且該過程被適當地編碼。 (NULL或特殊的默認值可以用來「旗幟」從舊系統調用)。


[新增]

一個可能的長期解決方案將是某種版本系統加入到每次數據庫更新時都會更新的數據庫。

  • 當一個應用程序啓動時,它獲取當前版本
  • 如果有來電時,它的參數跨版本不同,你適當地在通話的時候檢查和格式,如

    如果版本< 3然後調用PROC用1個參數

    否則呼叫PROC用2個參數

隨着時間的推移,這將會非常繁瑣和混亂,但如果您無法同時更新所有系統(A,B和數據庫),那麼您的選擇受到限制。

+0

謝謝。但請檢查上面的編輯。正如編輯中提到的那樣,數據庫沒有更新。我可能需要在代碼本身,應用程序B中處理這個問題。有什麼建議嗎? – snakepitbean

2

也許每個應用程序可以有自己的一套存儲過程,兒子他們不會互相打擾。

4

我不認爲有一個優雅的解決方案,但是,因爲您不能重寫整個應用程序,所以...在您的情景中,我會複製所有應用程序的SP並將它們放在單獨的模式中。

在您的數據庫中創建不同的用戶,並讓每個應用程序使用自己的用戶連接到數據庫。應用程序A的數據庫用戶(角色)不應該具有執行屬於其他模式的SP的權限,而應用程序B的數據庫用戶也應該具有相同的權限。

您需要重寫某些代碼當然,應用程序更改連接字符串。

相關問題