0

このデータベースの構造に応じて大きなコードベースを持つ mssql2005 の巨大なデータベース。

ファイル名またはファイルへのフルパスが含まれる同様のテーブルが約 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

これらすべてのテーブルの単一のビューを作成して、このデータ災害を使用する新しいコードがすべての異なるメディア テーブルについて知る必要がないようにしたいと考えています。また、insert ステートメントと update ステートメントにもこのビューを使用したいと思います。明らかに、古いコードはテーブルが最新であることを依然依存しています。

mssql2005 でのビューの作成に関するmsdn ページを読んだ後、SCHEMABINDINGを使用したビューでは十分ではないと思います。

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

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

4

3 に答える 3

2

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

于 2009-03-16T11:43:10.757 に答える
1

特定の条件を満たす場合、分割されたビューを変更できます。

これらの条件には、partitioning column各テーブルの主キーの一部として が含まれていること、およびパーティション分割列に対して重複しないチェック制約が設定されていることが含まれます。

これはあなたの場合ではないようです。

あなたの場合、次のいずれかを実行できます。

  • 従来のソフトが機能するように (計算列を使用して) テーブルをビューとして再作成し、新しいソフトからテーブル全体を参照します。
  • トリガーを使用INSTEAD OFしてテーブルを更新します。
于 2009-03-16T12:05:04.870 に答える
1

ビューが複数の実表に基づいている場合、ビューの UPDATE ステートメントは、UPDATE ステートメントに応じて機能する場合と機能しない場合があります。UPDATE ステートメントが複数のベース テーブルに影響する場合、SQL サーバーはエラーをスローします。一方、UPDATE がビュー内の 1 つのベース テーブルのみに影響する場合、UPDATE は機能します (常に正しく動作するとは限りません)。挿入ステートメントと削除ステートメントは常に失敗します。

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

INSTEAD OF INSERT トリガー
INSTEAD OF UPDATE トリガー
INSTEAD OF DELETE トリガー

于 2012-09-24T15:03:56.407 に答える