1

これを使用してビューを作成しました(他の列は無視されました):

create view view_table (is_root) as select
  case when C1 = 'Yes' then 1
       when C1 = 'No' then 0
       else 0
  end as is_root
  from remote_db_table

しかし、次を使用してビューを更新しようとしたとき:

update view_table set is_root=1

それは動作しません。それを行う方法はありますか?ビューはOracleにありますが、リモートテーブルはmySQLにあります

4

2 に答える 2

3

これをOracleで行うには、ビューにINSTEADOFトリガーを作成します。

create or replace trigger vt_instead
    instead of update on view_table
begin
    if :new.is_root != :old.is_root
    then
        update remote_db_table
        set C1 = case when :new.is_root = 1 then 'Yes'
                      else 'No' end
        where id = :new.id;
    end if;
end;
/

これにより、ビューに対してUPDATEを発行して、基になるビューに変更を伝播できます。

update view_table
set is_root = 0
where id = 23
/

MySQLデータベースのリモートテーブルに対してこれをテストしていません(そのような設定はありません)が、SQL * Plusでテーブルをリモートで更新できる場合は、トリガーも機能するはずです。


「40列すべてを更新したいのですが、上記のように更新できないのは1列だけです」

あなたはまだ完全に自分自身を明確にしていないのではないかと思いますが、あなたが求めているのは、翻訳を必要としない列の処理方法です。

トリガーDMLステートメントの代わりにINSTEADOFトリガーが起動します(手がかりは名前にあります)。つまり、ビューを介して更新するすべての列を処理する必要があります。あなたのシナリオでは、それはすべて40列になります。改訂されたトリガーコードは次のようになります。

create or replace trigger vt_instead
    instead of update on view_table
begin
    update remote_db_table
    set C1 = case when :new.is_root = 1 then 'Yes'
                  else 'No' end
        , C2 = :new.col2
        , C3 = :new.col3
        , C4 = :new.col4
        ....
        , C40 = :new.col40
    where id = :new.id;
end;
/

テーブル更新ステートメントに含まれていない列は、ビューから更新できません。

于 2012-11-04T15:37:59.803 に答える
1

あなたが試みていることは不可能だと思います。MySQLではビューに対して更新ステートメントを実行できますが、is_rootは派生列であるため、更新しても意味がありません(テーブルに戻るパスがないため)。

于 2012-11-04T02:03:59.687 に答える