3

次のような2つの結合されたテーブルで構成されるOracle 11gデータベースで作成されたビューがあります。

CREATE FORCE VIEW my_dataview
(
   key1,
   key2,
   column_from_table1,
   column_from_table2
)
AS
   SELECT key1,
          key2,
          column_from_table1,
          column_from_table2
     FROM table1
          NATURAL LEFT OUTER JOIN table2;

両方のソース テーブルには、 と という名前の 2 つの主キーがkey1ありkey2ます。table2データは正しく集計されていますが、ビューから直接列を更新できません。

次の更新を実行すると、

UPDATE my_dataview SET column_from_table2 = 'Hello, world' 
WHERE key1 = 1234
     AND key2 = 12;

それが与えるエラーはですORA-01779 cannot modify a column which maps to a non key-preserved table。また、強調表示されますcolumn_from_table2。同じコマンドを実行してcolumn_from_table1代わりに設定すると、機能します。table1 が結合に必要なテーブルであるためと思われます。

おそらく、主キーに参加していて、ビューに結果の列が1つしかないので、それが私の問題を説明していると最初に考えました。table2.key1ただし、別の列と列をビューに追加してtable2.key2も、データが不必要に複製されることを除いて、何も変わりませんでした。

INSTEAD OF トリガーを使用してビューを更新できることはわかっていますが、これをできる限りきれいに保ちたいと思います。とにかく、それは解決策というよりもハックのように思えます。

私の質問を要約すると、結合ビューで挿入、更新、および削除を有効にして、それが 2 つの別個のテーブルで構成されるビューであることさえわからないようにするための最善の行動計画は何ですか?

要求されたテーブル定義:

CREATE TABLE table1
(
   key1                 NUMBER(5)    NOT NULL,
   key2                 NUMBER(2)    NOT NULL,
   column_from_table_1  DATE  
);

CREATE UNIQUE INDEX pk_table1_index ON table1
(key1, key2);

ALTER TABLE table1 ADD (
   CONSTRAINT table1_Pkey
   PRIMARY KEY
   (key1, key2)
   USING INDEX pk_table1_index
   ENABLE VALIDATE);

CREATE TABLE table2
(
   key1                 NUMBER(5)    NOT NULL,
   key2                 NUMBER(2)    NOT NULL,
   column_from_table_2  VARCHAR2(20)
);

CREATE UNIQUE INDEX pk_table2_index ON table2
(key1, key2);

ALTER TABLE table2 ADD (
   CONSTRAINT table2_Pkey
   PRIMARY KEY
   (key1, key2)
   USING INDEX pk_table2_index
   ENABLE VALIDATE);
4

2 に答える 2