複数のテーブルと計算値を含むmysqlの更新可能なビュー
-
19-08-2019 - |
質問
このデータベースの構造に依存する大きなコードベースを持つ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
これらのすべてのテーブルの単一ビューを作成して、このデータ災害を使用する新しいコードがすべての異なるメディアテーブルについて知る必要がないようにしたいと思います。また、このビューを挿入および更新ステートメントに使用したいと思います。明らかに、古いコードは依然として最新のテーブルに依存しています。
mssql2005でのビューの作成に関するmsdnページを読んだ後 SCHEMABINDINGを使用したビューでは十分ではないと思います。
このような更新可能なビューを作成するにはどうすればよいですか
これは正しい方法ですか?
解決
特定の条件を満たす場合、パーティションビューを変更できます。
これらの条件には、各テーブルの主キーの一部としてpartitioning column
が含まれること、およびパーティション列の重複しないチェック制約のセットが含まれることが含まれます。
これはあなたのケースではないようです。
あなたの場合、次のいずれかを実行できます:
- テーブルをビューとして(計算列を使用して)レガシソフトが機能するように再作成し、新しいソフトからテーブル全体を参照します
-
INSTEAD OF
トリガーを使用してテーブルを更新します。
他のヒント
リンクしたページを下にスクロールすると、更新可能なビューに関する段落が表示されます。他の制限事項の中でも、ユニオンに基づいてビューを更新することはできません。この背後にあるロジックはおそらく簡単です。SQLServerはどのソーステーブル/ビューが更新/挿入を受信するかをどのように決定する必要がありますか?
ビューが複数のベーステーブルに基づいている場合、ビューのUPDATEステートメントは、UPDATEステートメントに応じて機能する場合と機能しない場合があります。 UPDATEステートメントが複数のベーステーブルに影響する場合、SQLサーバーはエラーをスローします。一方、UPDATEがビュー内の1つのベーステーブルのみに影響する場合、UPDATEは機能します(常に正しくはありません)。 insertおよびdeleteステートメントは常に失敗します。
INSTEAD OFトリガーは、複数のベーステーブルに基づくビューから正しくUPDATE、INSERT、およびDELETEするために使用されます。次のリンクには、サンプルとビデオチュートリアルがあります。
INSTEAD OF INSERTトリガー
INSTEAD OF UPDATEトリガー
INSTEAD OF DELETEトリガー