我們有一個數據庫服務器,它有大約10個數據庫。常用功能/所有數據庫的存儲過程
我想創建可以在所有數據庫中使用某些功能/存儲過程。
例如,我們可以在任何數據庫中使用sp_executesql
。
我們有這樣一些要求是(獲取當前學年,財政年度,等...)
是否可行?謝謝。
我們有一個數據庫服務器,它有大約10個數據庫。常用功能/所有數據庫的存儲過程
我想創建可以在所有數據庫中使用某些功能/存儲過程。
例如,我們可以在任何數據庫中使用sp_executesql
。
我們有這樣一些要求是(獲取當前學年,財政年度,等...)
是否可行?謝謝。
正如其他人的建議,你可以把對象到主數據庫,但微軟明確建議您should not do that。無論如何,我發現這個解決方案相當有風險,因爲master數據庫是由系統「擁有」的,而不是由你自己擁有的,所以不能保證它將來會繼續以相同的方式運行。
相反,我認爲這是主要部署問題。有(至少)兩個策略,你可以使用:
第二個選擇也許是更好的選擇,因爲如果你的函數使用表(例如你使用日曆表來獲得學年,這比計算它容易得多),那麼你將不得不創建相同的表也在每個數據庫中。通過使用同義詞,你只需要維護一組表格。
對於實際部署,使用腳本來管理對象很簡單,因爲您只需要一個數據庫列表來連接並運行每個DDL腳本。您可以使用批處理文件和SQLCMD(可能在.sql腳本中使用SQLCMD變量),或者使用PowerShell或您喜歡的任何其他語言來驅動它。
取決於SP其實呢,要以sp_創造主的程序,將其命名並將其標記爲一個系統過程是什麼:
http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx
幾個選項:
您可以像Cade所說的那樣使用系統存儲過程。我過去已經完成了這個工作,並且工作正常。對此的一個警告是sp_MS_marksystemobject
過程沒有記錄,這可能意味着它可能會在未來的SQL版本中消失或更改而不會發出警告。回想起來,我認爲在功能上使用這種方法還存在其他問題。
另一種方法是使用標準化的程序和功能,並使用sp_MSforeachdb
運行對每個數據庫代碼滾出來在你的數據庫。如果您只需要針對您的10個數據庫運行,則可以複製此過程中的代碼並對其進行修改,以便在運行代碼之前檢查數據庫是否與您的模式相匹配(或者您可以編寫自己的版本以執行類似的操作)。
+1得到一個全面的答案。 – Withheld 2014-08-21 17:36:33