2012-02-02 39 views
1

我們有一個數據庫服務器,它有大約10個數據庫。常用功能/所有數據庫的存儲過程

我想創建可以在所有數據庫中使用某些功能/存儲過程。

例如,我們可以在任何數據庫中使用sp_executesql

我們有這樣一些要求是(獲取當前學年,財政年度,等...)

是否可行?謝謝。

回答

3

正如其他人的建議,你可以把對象到主數據庫,但微軟明確建議您should not do that。無論如何,我發現這個解決方案相當有風險,因爲master數據庫是由系統「擁有」的,而不是由你自己擁有的,所以不能保證它將來會繼續以相同的方式運行。

相反,我認爲這是主要部署問題。有(至少)兩個策略,你可以使用:

  • 部署對象,每個數據庫
  • 將它們部署到一個「參考」的數據庫,僅用於共享對象和創建同義詞在其他數據庫

第二個選擇也許是更好的選擇,因爲如果你的函數使用表(例如你使用日曆表來獲得學年,這比計算它容易得多),那麼你將不得不創建相同的表也在每個數據庫中。通過使用同義詞,你只需要維護一組表格。

對於實際部署,使用腳本來管理對象很簡單,因爲您只需要一個數據庫列表來連接並運行每個DDL腳本。您可以使用批處理文件和SQLCMD(可能在.sql腳本中使用SQLCMD變量),或者使用PowerShell或您喜歡的任何其他語言來驅動它。

+0

+1得到一個全面的答案。 – Withheld 2014-08-21 17:36:33

0

幾個選項:

您可以像Cade所說的那樣使用系統存儲過程。我過去已經完成了這個工作,並且工作正常。對此的一個警告是sp_MS_marksystemobject過程沒有記錄,這可能意味着它可能會在未來的SQL版本中消失或更改而不會發出警告。回想起來,我認爲在功能上使用這種方法還存在其他問題。

另一種方法是使用標準化的程序和功能,並使用sp_MSforeachdb運行對每個數據庫代碼滾出來在你的數據庫。如果您只需要針對您的10個數據庫運行,則可以複製此過程中的代碼並對其進行修改,以便在運行代碼之前檢查數據庫是否與您的模式相匹配(或者您可以編寫自己的版本以執行類似的操作)。

相關問題