1

Item、Places、Categoriesなどのテーブルを持つ抽象データベース構造を使用する3つのWebサイトと、GetItemsByCategory、GetRelatedItemsなどのストアドプロシージャがあります。実際には、これら3つの異なるWebサイトにまったく同じデータベース構造を使用しています。

コードの観点からは、すべてのWebサイトに同じコードを使用しています(各Webサイトに固有のHTMLを除く)。すべての共通コードは、すべてのWebサイトで使用されるいくつかのプロジェクトに含まれているため、バグを検出するたびに(すべてのWebサイトにあります) )私はそれを1つの場所(すべての人が使用する共通の部分)で修正するだけで、自動的にすべてのWebサイトが修正を取得します。

実際には、Asp.netMVC3とSQLサーバーを使用しています。

機能を拡張したいとき、新しいテーブル、ストアドプロシージャ、またはデータベースに関連するものが必要になるたびに、各データベースで変更を行う必要があります。

  • 同じ柔軟性を持ち、すべてのWebサイトに対してデータベースの変更を1回だけ行うために使用できるアプローチを知っていますか?

  • 私は良いアプローチを使用していると思いますか、それともあなたの意見では別のものを使用する必要がありますか?

4

2 に答える 2

1

データベースが単一のサーバー上にある場合は、Management Studioからプロシージャのスクリプトを生成し、[オブジェクトの存在を確認する]オプション([ツール]>[オプション]>[SQLServerオブジェクトエクスプローラー]>[スクリプト])を必ず使用してください。これにより、次のような結果が得られます(最も重要なのは、動的SQLを使用して実行できるものとしてストアドプロシージャコードを生成することです)。

USE DBName;
GO

SET ANSI_NULLS ON;
GO

SET QUOTED_IDENTIFIER ON;
GO

IF NOT EXISTS (...)
BEGIN
    EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.whatever ...
    '
END
GO

このスクリプトができたので、複数のデータベースで機能するようにスクリプトを変更できます。@ statement =の部分をスワイプして、再利用するだけです。まず、これを機能させたいデータベースを@table変数に詰め込む必要があります(または、必要に応じて、これを永続テーブルに配置できます)。次に、各データベースで実行するコマンドを作成できます。

DECLARE @dbs TABLE (name SYSNAME);

INSERT @dbs(name) SELECT N'db1';
INSERT @dbs(name) SELECT N'db2';
INSERT @dbs(name) SELECT N'db3';

-- now here is where we re-use the create / alter procedure command from above:

DECLARE @statement NVARCHAR(MAX) = N'CREATE PROCEDURE dbo.whatever ...
    ';

-- now let's build some dynamic SQL and run it!

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + '
  EXEC ' + QUOTENAME(name) + '.dbo.sp_executesql N''' + @statement + ''';'
  FROM @dbs;

EXEC sys.sp_executesql @sql;

sp_msforeachdbまたは、myまたはsp_ineachdbreplacementsのカスタムバージョンを作成することもできます。

以前はSQLFarmsCombineというツールを使用していましたが、ツールが存在しないか、他社に飲み込まれたり、ブランドが変更されたりした可能性があります。その後、 RedGateは同様の機能を持つSQLマルチスクリプトを作成しました。

于 2012-08-15T16:45:41.270 に答える
0

websiteIdという名前の列をすべてのテーブルに追加した場合、データベースは1つだけになります。一意のwebsiteIdを各サイトのweb.configに保存し、データのリクエストごとに渡します。明らかに、各サイトのデータはWebサイトIDとともに保存されるため、Webサイトごとにデータを照会できます。

これは、データベースとデータベースへの呼び出しを少しリファクタリングすることを意味しますが、一度実行すると、維持するデータベースは1つだけになります。

もちろん、これはデータベースが同じサーバー上にあることを前提としています...

于 2012-08-16T00:00:06.150 に答える