Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Триггер на матвью на удаленную таблицу и XML  [new]
У меня нет степлера
Guest
Господа, добрый день.

Натолкнулся на такую проблему. Есть таблица на удаленной базе, у нее там же матвью лог. На моей стороне на нее смотрит матвью, на матвью висит триггер, который при быстром обновлении матвью записывает изменения в другую таблицу. Проблема с полем XML. Матвью обновляется нормально, а вот триггер или не видит его значение, или видит не то:
- После вставки записи на источнике при обновлении матвью триггер вызывается почему-то дважды, на Insert и Update, XML поле оба раза пустое;
- После изменения записи на источнике при обновлении матвью триггер вызывается дважды на Update, первый раз в XML идет старое значение, второй раз пустое;
- Удаление отрабатывает нормально.
Если источник и матвью находятся на одной базе - проблем не проявляется.
+ Тест-кейс

-- На удаленной базе
create table test_table(
id integer primary key,
xmldata sys.xmltype
);

create materialized view log on test_table
with primary key;

-- На своей базе
create materialized view mv_test_table
refresh fast on demand
as
select id, xmldata
from test_table@dblink;

create table test_table_log(
id integer,
xmldata sys.xmltype,
change_type varchar2(1),
change_id integer
);

create sequence seq_test_table_log;

create or replace trigger trg_test_table
after insert or update or delete on mv_test_table
for each row
begin
if inserting then
insert into test_table_log values (:new.id, :new.xmldata, 'I', seq_test_table_log.nextval);
elsif updating then
insert into test_table_log values (:new.id, :new.xmldata, 'U', seq_test_table_log.nextval);
elsif deleting then
insert into test_table_log values (:old.id, :old.xmldata, 'D', seq_test_table_log.nextval);
end if;
end;

-- На удаленной базе
insert into test_table (id, xmldata) values (1, xmltype('<a>Insert</a>'));
commit;

-- На своей базе
begin
dbms_mview.refresh('MV_TEST_TABLE', 'F');
end;
/
select * from test_table_log

-- На удаленной базе
update test_table
set xmldata = xmltype('<a>Update</a>')
where id = 1;
commit;

-- На своей базе
begin
dbms_mview.refresh('MV_TEST_TABLE', 'F');
end;
/
select * from test_table_log

Кто-то сталкивался ? Я сам с XML почти не работал, так что прошу не пинать
7 май 12, 12:16    [12519485]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на матвью на удаленную таблицу и XML  [new]
У меня нет степлера
Guest
Oracle
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE	10.2.0.4.0	Production
TNS for HPUX: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
7 май 12, 12:19    [12519500]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на матвью на удаленную таблицу и XML  [new]
У меня нет степлера
Guest
Кому лень вопроизводить тест-кейс - вот что получается в итоге:

ID  XMLDATA         CHANGE_TYPE CHANGE_ID
1                   I           1
1                   U           2
1   <a>Insert</a>   U           3
1                   U           4
7 май 12, 13:39    [12519942]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить