web-dev-qa-db-ja.com

Oracleでは、ビューを介してレコードを挿入または更新できますか?

Oracleでは、ビューを介してレコード(行)を挿入または更新できますか?

32

Oracleのビューは、特定の条件下で更新可能です。扱いにくい場合があり、通常ははお勧めできません。

Oracle 10g SQLリファレンス から:

更新可能なビューに関する注意

更新可能なビューは、ベーステーブルの行を挿入、更新、または削除するために使用できるビューです。本質的に更新可能なビューを作成するか、任意のビューでINSTEAD OFトリガーを作成して更新可能にすることができます。

本質的に更新可能なビューの列を変更できるかどうか、およびその方法を学習するには、USER_UPDATABLE_COLUMNSデータディクショナリビューを照会します。このビューで表示される情報は、本質的に更新可能なビューでのみ意味があります。ビューが本質的に更新可能であるためには、次の条件が満たされている必要があります。

  • ビューの各列は、単一のテーブルの列にマップする必要があります。たとえば、ビューの列がTABLE句(ネストされていないコレクション)の出力にマッピングされる場合、ビューは本質的に更新可能ではありません。
  • ビューには、次の構成要素を含めることはできません:
    • 集合演算子
    • dISTINCT演算子
    • 集約または分析関数
    • GROUP BY、ORDER BY、MODEL、CONNECT BY、またはSTART WITH句
    • SELECTリスト内のコレクション式
    • SELECTリスト内のサブクエリ
    • WITH READ ONLYと指定されたサブクエリ
    • Oracle Database管理者ガイドに記載されているように、いくつかの例外を除いて結合します

また、本質的に更新可能なビューに疑似列または式が含まれている場合、これらの疑似列または式のいずれかを参照するUPDATE文でベース表の行を更新することはできません。

結合ビューを更新可能にするには、次の条件がすべて満たされている必要があります。

  • DMLステートメントは、結合の基礎となる1つのテーブルのみに影響する必要があります。
  • INSERTステートメントの場合、ビューはWITH CHECK OPTIONで作成されてはならず、値が挿入されるすべての列はキー保存されたテーブルからのものでなければなりません。キー保存表は、基本表のすべての主キーまたは一意のキー値が結合ビューでも一意である表です。
  • UPDATEステートメントの場合、更新されるすべての列はキー保存されたテーブルから抽出する必要があります。ビューがWITH CHECK OPTIONで作成された場合、結合列およびビュー内で複数回参照されるテーブルから取得された列は、UPDATEから保護する必要があります。
  • DELETE文の場合、結合によって複数のキー保存表が作成されると、ビューがWITH CHECK OPTIONで作成されたかどうかに関係なく、Oracle DatabaseはFROM句で指定された最初の表から削除します。
42
DCookie

Oracleには、ビューを更新可能にする2つの異なる方法があります。

  1. ビューは、更新しようとしているものに関して「キー保存」されています。これは、基になるテーブルの主キーがビューにあり、行がビューに1回だけ表示されることを意味します。これは、Oracleが更新する基になるテーブル行を正確に把握できることを意味しますOR
  2. トリガーの代わりに書き込みます。

代わりのトリガーから離れて、ビューを介さずに、基になるテーブルを直接更新するコードを取得します。

10
WW.

ビューを介してレコードを更新できるのは2回あります。

  1. ビューに結合またはプロシージャコールがなく、単一の基礎となるテーブルからデータを選択する場合。
  2. ビューに INSTEAD OF INSERTトリガー が関連付けられている場合。

一般に、INSTEAD OFトリガーを特に記述していない限り、ビューへの挿入を実行できることに依存すべきではありません。更新の実行に役立つように記述できるINSTEAD OF UPDATEトリガーもあります。

4
LBushkin

[〜#〜] yes [〜#〜]、更新およびビューへの挿入が可能で、その編集は元のテーブルに反映 ....
[〜#〜] but [〜#〜]
1-ビューには、テーブル上のすべてのNOT NULL値が必要です。
2-アップデートにはテーブルと同じルール ...「他の外部キーに関連する主キーの更新など」が必要です...

0
Radi Soufan