0

私は管理する次のタスクを持っています。サーバー「A」とサーバー「B」の間にデータベースリンクがあります。これらのテーブルを指すテーブルをサーバー「A」に作成し、ビューをサーバー「B」に作成しました。

I.Ex. サーバー「A」のテーブルcustomersとサーバー「A」のテーブルを指すサーバー「B」のビューcustomers。

ビューに更新機能を提供するために、ビューに更新の代わりにトリガーを作成しました。

PROMPT CREATE OR REPLACE TRIGGER tudb_customers
CREATE OR REPLACE TRIGGER tudb_customers instead of update or delete on customers
REFERENCING NEW AS NEW OLD AS OLD
for each row

declare
proc_typ_old char;
proc_typ char;
begin
if updating then
    proc_typ := 'U';
else
    proc_typ := 'D';
end if;

if proc_typ = 'U' then
    update customers@db_link set customersname=:new.customersname
    where customersid = :old.customersid;
else
delete from customers@db_link where customersid = :old.customersid;
end if;
end TUDB_MOB_ZUG;
/

サーバー'B'のビューを更新しようとすると(customers set Customersname ='Henry'を更新します。customersid=1):old.customersidは常にnullです。したがって、更新は失敗します。

Oracleバージョンは10.2.0.1.0です

誰かがこの問題で私を助けることができますか?何か案は?

あいさつ、クリス

4

2 に答える 2

3

10.2.0.5では問題なく動作するように見えるため、これはバグである可能性があります。バグ4386090('OLD VALUE RETURN NULL IN "INSTEAD OF" TRIGGER BASED ON DBLINK):oldは、DBリンクがある場合、トリガー内で値がnullのように診断分析から聞こえます。これは、10.2.0.3パッチセットノートにリストされている4771052('INSTEAD-OFトリガーはdblinkを介してテーブルを正しく更新しません'が、詳細を表示できません)の複製として閉じられたようです。

これが同じ問題であることを確認するには、OracleでSRを上げる必要がありますが、10gがしばらくサポートされていないため、パッチを適用するようにアドバイスする以上のことはしないと思われます。残念ながら、回避策はリストされていません。

ビューが単一のテーブルの場合(最初の説明からのように思われます)、トリガーが必要かどうかさえわかりません。作業を直接更新および削除します。ビューにINSTEADOFトリガーが必要ですか?

于 2012-08-23T11:43:14.980 に答える
0

@AlexPooleに同意します。これはバグである可能性があり、Oracleに連絡するときにパッチを適用することをお勧めします。

また、ビューを介して更新する必要がない場合もあります。

ただし、この時点で私があなたであれば、これがクライアントとデータベース間の接続を確立するための良い方法であるかどうかを考えます。つまり、dblinkを介してOracleインスタンス(サーバー'B')を実際のdbインスタンス(サーバー'A')に接続し、クライアントがサーバー'B'を介して間接的に実サーバーに接続できるようにすることを意味します。ある時点で、おそらくネットワークの問題である何かを解決する簡単な方法のように見えるのは一種のハックだと思いますが、後で、今回のようにさらに問題が発生します。

于 2012-08-23T12:31:49.447 に答える