Oracle V$LOGMNR_CONTENTS для таблицы с UDT - соединение операций UPDATE и INTERNAL
Я обновляю таблицу оракула с помощью UDT (определяемого пользователем типа), а затем запрашиваю
V$LOGMNR_CONTENTS
Посмотреть. Я вижу, что для каждой обновленной строки есть 2 записи - ОБНОВЛЕНИЕ и ВНУТРЕННЯЯ. Мне нужно выяснить, как установить связь между ними, поскольку операция UPDATE имеет временное значение в
ROW_ID
и правильное значение появляется только во ВНУТРЕННЕЙ операции, и я не уверен, как соотносятся их номера SCN. Я думаю о том, чтобы сделать очередь ОБНОВЛЕНИЙ на
DATA_OBJ#
и свяжите их с ВНУТРЕННИМИ FIFO. Что мне не хватает?
Сценарий:
CREATE TYPE srulon AS OBJECT (name VARCHAR2(30),phone VARCHAR2(20) );
create table root.udt_table (myrowid rowid, myudt srulon);
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null, srulon('small', '1234'));
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
insert into root.udt_table values (null, srulon('small', '1234'));
update root.udt_table set myrowid=rowid, myudt = srulon('smaller', rowid);
commit;
BEGIN rdsadmin.rdsadmin_util.switch_logfile;END;
Запрос (после START_LOGMNR для последнего журнала):
select scn, SEQUENCE#,operation, SQL_REDO, ROW_ID from V$LOGMNR_CONTENTS
where session# = 6366 and not operation like '%XML%'
order by scn, SEQUENCE#;
Полученные результаты:
| SCN | SEQUENCE# | OPERATION | ROW\_ID | SQL\_REDO |
| :--- | :--- | :--- | :--- | :--- |
| 240676056 | 1 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676056 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT\_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAA' where a."MYROWID" IS NULL; |
| 240676057 | 5 | INTERNAL | AAB1avAAAAAAwT7AAA | NULL |
| 240676058 | 1 | UPDATE | AAAAAAAAAAAAAAAAAA | update "ROOT"."UDT\_TABLE" a set a."MYROWID" = 'AAB1avAAAAAAwT7AAB' where a."MYROWID" IS NULL; |
| 240676059 | 5 | INTERNAL | AAB1avAAAAAAwT7AAB | NULL |
| 240676069 | 1 | COMMIT | AAAAAAAAAAAAAAAAAA | commit; |
2 ответа
Номер изменения системы (SCN) - это основная функция управления, которая используется для отслеживания транзакционной активности базы данных. SCN - это штамп, который определяет зафиксированную версию базы данных в определенный момент времени. Каждой совершенной транзакции назначается уникальный SCN. БД ведет учет всех изменений базы данных с помощью номеров SCN. SCN - это текущий номер для изменений в базе данных.
Чтобы получить текущий SCN, используйте
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER()
Таким образом, между операцией UPDATE и INTERNAL нет другой связи, тогда как тот факт, что SCN UPDATE ниже, чем INTERNAL SCN, но нет расчетного или логического соединения
Ошибка заключалась в том, чтобы
order by scn, SEQUENCE#
. после удаления предложения order by каждый ВНУТРЕННИЙ оператор следует за соответствующим UPDATE. кредит достается срулону.