2011-06-30 7 views
4

私たちは次のことを考えてみましょう:更新可能なビュー(オラクル)

create view view_1 as 
(
    select key, data from some_table_or_view; 
); 

create table table_1 
(
    key 
    more_data 
); 

create view view_2 as 
(
    select v1.key, v1.data, t1.more_data 
    from view_1 v1, table_1 t1 
    where v1.key = t1.key 
); 

create table table_2 as 
(
    key 
    data 
    more_data 
); 

create view view_3 as 
(
    select key, data, more_data from view_2 
    union 
    select key, data, more_data from table_2 
); 

だから基本的に、我々は、2つのデータフィード、参加から来ている1、生データである1に参加しています。

私は次のことができるようにしたいと思います。

これは何とか "BLAH_KEY" は table_1table_2から来ているかどうかに応じ table_1table_2のいずれかを更新
update view_3 set more_data = 'BLAH_MORE_DATA' where key = 'BLAH_KEY'; 

現在、私は考えることができる唯一の方法は次のとおりです。その後、

create view view_3 as 
(
    select 'TAB1' as source, key, data, more_data from view_2 
    union 
    select 'TAB2' as source, key, data, more_data from table_2 
); 

とソース列をチェックし、適切なテーブルを更新PL/SQL関数を使用してアップデートを行うが、これは私が保管しなければならないことを意味ビューとPL/SQLファンクションを同期させます。

私はこれを行うより良い方法をお探しです。

+1

複雑なロジックを実装するには、PL/SQLプロシージャを使用するのがいい方法です:)私はschurikのトリガの答えをうまく使いこなしましたが、これは動作するためです。 –

答えて

7

あなたがschurikの答えを適応して、アカウントに "他に-IF-heimer病" についてコメントを取ってview_3

CREATE OR REPLACE TRIGGER view3_trg 
INSTEAD OF UPDATE 
ON view_3 
FOR EACH ROW 
BEGIN 
IF :OLD.source = 'TAB1' THEN 

    UPDATE table_1 t1 
    set t1.data = :NEW.data 
    WHERE 
    t1.key = :OLD.key 
    ; 
ELSIF OLD.source = 'TAB2' THEN 
    UPDATE table_2 t2 
    set t2.data = :NEW.data 
    WHERE 
    t2.key = :OLD.key 
    ; 
END IF; 
END; 
/
2

に代わり、トリガーの使用することができます。

CREATE OR REPLACE TRIGGER view3_trg 
INSTEAD OF UPDATE 
ON view_3 
FOR EACH ROW 
BEGIN 
    UPDATE table_1 t1 
    set t1.data = :NEW.data 
    WHERE t1.key = :OLD.key; 

    UPDATE table_2 t2 
    set t2.data = :NEW.data 
    WHERE t2.key = :OLD.key; 
END; 

/

2
create view view_2 as 
(
    select v1.key, v1.data, t1.more_data 
    from view_1 v1, table_1 t1 
    where v1.key = t1.key 
); 

View_2はおそらく更新できません。または少なくとも強制的な外部キー関係にある子テーブルの列のみ。

user_updatable_columnsをチェックして、ビューのどの列を自動的に更新できるかを確認します(つまり、Oracleの列の更新が決してあいまいにならないようにすることができます)。たとえば、EMPとDEPTを使用すると、SMITHとJONESが同じ部門で機能している場合は、SMITHの部門名を更新することはできません(dept_nameは親の属性なので)。

関連する問題