2012-01-18 8 views
0

それぞれの「顧客」に独自のデータベースがあるプロジェクトを継承しました。何百ものデータベースがあります。ストアドプロシージャは現在使用されていません。何百もの同一のデータベースに1組のストアドプロシージャを使用

ここでデータを消費するためのベストプラクティスは何ですか?ストアドプロシージャを「マスター」データベースに保存し、動的SQLを使用してデータを処理しますか?はるかに良い方法があるように思われる。ストアドプロシージャを何百ものDBにプッシュして、すべてのストアドプロシージャを同期させた状態に保つための仕事を実行したくないのです。

この動的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 

私は、SELECTを実行しているEXEC sp_executesql 'USE ' + @DataBase + '; GO'を試してみましたが、私はその作業を得ることができませんでした。

答えて

0

私はそれを理解しました。これはおそらくSQLの専門家を非常に怒らせるでしょうが、私はこのソリューションに満足しています。

「master」にストアドプロシージャを作成しました。私はこれが通常no-noであることを知っています。私はシステムオブジェクトとして各sprocをマークするために

USE master 
EXEC sys.sp_MS_marksystemobject [sp_Users_SELECT] 
GO 

を使用しました。このようにして、別の状況下で呼び出すことができます。私は、これを行うことができます。

USE DataBase200 
EXEC sp_Users_SELECT 

、それは実際にそのデータベースへのSPROCを展開することなく、DataBase200 DBのコンテキストで実行されます。それは今のところすごくうまくいっています。システム・オブジェクトとして認識されるためには、ストアード・プロシージャー名の接頭部にsp_を付ける必要があります。

私はこれが誰かを助けてくれることを願っています。

1

各データベースにストアドプロシージャを展開すると何が問題になるのでしょうか。

スキーマの変更も展開する必要があります。自動的に行うためのインフラストラクチャがあるようにしてください。そうでなければ、そのインフラを構築する時間です。

+0

私はデータベースを所有しておらず、新しいデータベースを作成することもできません。これはオフラインアプリケーションによって処理されます - 私はこれをモバイルウェブサイトで補完しています。個々のデータベースの変更を控えたい。今のところ私は素早く汚れたデータレイヤーを書いており、SQLインジェクション攻撃を防ぐためには慎重に扱っています。 –

関連する問題