これを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;
/
テーブル更新ステートメントに含まれていない列は、ビューから更新できません。