2012-01-18 37 views
0

我繼承了一個項目,其中每個「客戶」都有自己的數據庫。有數百個數據庫。存儲過程目前未被使用。對數百個相同的數據庫使用一組存儲過程

什麼是在這裏使用數據的最佳實踐?我是否將存儲過程保留在「主數據庫」中並使用動態SQL來處理數據?似乎應該有更好的方法。我不希望有一份工作能夠推動數百個數據庫的存儲過程,以保持所有存儲過程的同步。

這個動態SQL正在工作,但我想要一個更好的方法。

CREATE PROCEDURE [Users_SELECT] 
@DataBase nvarchar(20), 
@UserID uniqueidentifier 
AS 
BEGIN 
DECLARE @sql nvarchar(max) 
SET @sql = '' 
SET @sql += 'SELECT * FROM ' + @DataBase + '.dbo.Users u ' 
SET @sql += 'WHERE [email protected] ' 
EXEC sp_executesql @sql, N'@UserID uniqueidentifier', @UserID 
END 

我試圖EXEC sp_executesql 'USE ' + @DataBase + '; GO'然後運行一個SELECT,但我無法得到那個工作。

回答

0

我想通了。這可能會讓SQL專家非常生氣,但我對解決方案感到滿意。

我在'master'中創建了我的存儲過程。我知道這通常是一個禁忌。然後我使用

USE master 
EXEC sys.sp_MS_marksystemobject [sp_Users_SELECT] 
GO 

將每個sproc標記爲系統對象。這樣,他們可以在不同的環境下被調用。那麼我可以這樣做:

USE DataBase200 
EXEC sp_Users_SELECT 

,它會在DataBase200分貝的環境中運行,而無需實際部署存儲過程到該數據庫。迄今爲止,它工作得很好。請記住,您必須在sp_前加上存儲過程名稱的前綴,以便將它們識別爲系統對象。

我希望這可以幫助別人。

1

我看不出將存儲過程部署到每個數據庫有什麼問題。

您還必須對模式部署更改,以便您希望基礎架構能夠自動執行。如果不是,那麼建立基礎設施是時間。

+0

我不擁有數據庫,也不擁有創建新數據庫的能力。這是由一個離線應用程序處理 - 我正在補充與移動網站。我想避免單獨更改數據庫。現在我正在寫一個快速而髒的數據層,並且儘可能小心地防止SQL注入攻擊。 – 2012-01-23 19:17:54

相關問題