次のような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);