2009-03-16 5 views
0

このデータベースの構造に応じて大きなコードベースを持つmssql2005の巨大なデータベース。複数のテーブルと計算値を持つmssqlの更新可能なビュー

私は約10の類似したテーブルを持っています。それらはすべて、ファイル名またはファイルへのフルパスのいずれかを含んでいます。フルパスは常にアイテムIDに依存するため、データベースに格納するのは意味がありません。これらのテーブルのうち、有用なデータを取得することはほとんどない。このように書き:このデータ・災害を使用して、新しいコードがに関するすべてを知っている必要がないように

SELECT a.item_id 
, a.filename 
FROM (
    SELECT id_item AS item_id 
    , path AS filename 
    FROM xMedia 

    UNION ALL 

    -- media_path has a different collation 
    SELECT item_id AS item_id 
    , (media_path COLLATE SQL_Latin1_General_CP1_CI_AS) AS filename 
    FROM yMedia 

    UNION ALL 

    -- fullPath contains more than just the filename 
    SELECT itemId AS item_id 
    , RIGHT(fullPath, CHARINDEX('/', REVERSE(fullPath))-1) AS filename 
    FROM zMedia 

    -- real database has over 10 of these tables 
) a 

私はすべてのこれらのテーブルの単一のビューを作成したいのですが異なるメディアテーブル。私はまた、このビューを挿入ステートメントと更新ステートメントに使用したいと思います。明らかに、古いコードはテーブルに依存して最新のものになるでしょう。

creating views in mssql2005のmsdnページを読んだあと、私はSCHEMABINDINGのビューでは十分ではないと思います。

このような更新可能なビューを作成するにはどうすればよいですか?

これは正しい方法ですか?

答えて

1

パーティションビューは、特定の条件を満たしていれば変更できます。

これらの条件には、各テーブルのプライマリキーの一部として、パーティション化カラムの重複しないチェック制約が設定されていることが含まれます。

これはあなたのケースではないようです。動作するソフトレガシーのために(計算カラムと)意見として

  • を再作成し、あなたのテーブル、そして新しいソフト
  • から全体の表を参照してください:あなたのケースでは

    は、次のいずれかを行うことができます

  • INSTEAD OFトリガーを使用してテーブルを更新します。
2

リンクしたページを下にスクロールすると、更新可能なビューに関する段落が表示されます。他の制限の中でも、ユニオンに基づくビューを更新することはできません。この背後にあるロジックはおそらく単純ですが、SQL Serverはどのソーステーブル/ビューに更新/挿入を受け取るべきかを決めるべきでしょうか?

+1

あなたは、実際に、彼らはあなたが更新しているテーブルを識別しますparitioning列が含まれていることを提供UNIONさんに基づいてビューを更新することができます。 – Quassnoi

1

ビューが複数のベーステーブルに基づいている場合、ビューのUPDATEステートメントはUPDATEステートメントによっては機能しない場合があります。 UPDATE文が複数の基本表に影響する場合、SQL Serverはエラーをスローします。一方、UPDATEがビュー内の1つの基本表にのみ影響を与える場合、UPDATEが機能します(常に正しくない)。 insert文とdelete文は常に失敗します。

INSTEAD OFトリガーは、複数の基本表に基づくビューからUPDATE、INSERTおよびDELETEを正しく使用するために使用されます。以下のリンクには、同じ例のビデオチュートリアルとともに例があります。

INSTEAD OF INSERT Trigger
INSTEAD OF UPDATE Trigger
INSTEAD OF DELETE Trigger

関連する問題