|
Программирование >> Oracle
Пакет DBMS LOGMNR 1653 3 / Type created. tkyte@TKYTE816> drop table t; Table dropped. tkyte@TKYTE816> create table t (a int, b myArrayType, c myTableType) 2 nested table c store as c tbl Table created. tkyte@TKYTE816> begin 2 sys.dbms logmnr d.build(miner dictionary.dat, 3 c:\temp); 4 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> alter system switch logfile; System altered. tkyte@TKYTE816> insert into t values (1, 2 myArrayType(myScalarType(2, sysdate, hello)), 3 myTableType(myScalarType(3, sysdate+1, GoodBye)) 4 ) ; 1 row created. tkyte@TKYTE816> alter system switch logfile; System altered. Итак, в представленном выше примере мы создали ряд объектных типов, добавили таблицу, использующую эти типы, снова экспортировали словарь данных, а затем выполнили один оператор ЯМД для этой таблицы. Теперь посмотрим, что скажут о выполненных действиях средства LogMiner: tkyte@TKYTE816> begin 2 sys.dbms logmnr.add logfile(C:\oracle\rdbms\ARC00028.001, 3 dbms logmnr.NEW); 4 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> begin 2 sys.dbms logmnr.start logmnr 3 (dictFileName=> c:\temp\miner dictionary.dat); 4 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> select scn, sql redo, sql undo 2 from v$logmnr contents 1654 Приложение А SCN SQL REDO SQL UNDO 824288 824288 824288 824288 set transaction read write; 824288 insert into delete from TKYTE.C TBL(NESTED T TKYTE.C TBL where ABLE ID,X,Y,Z) NESTED TABLE ID = values HEXTORAW(252cb5fad8 (HEXTORAW(252cb5fad 784e2ca93eb432c2d35b 8784e2ca93eb432c2d35 7c) and X = 3 and Y b7c),3,TO DATE(23- = JAN-2001 16:21:44, TO DATE(23-JAN-2001 DD-MON-YYYY 16:21:44, HH2 4:MI:SS),GoodBy DD-MON-YYYY e); HH24:MI:SS ) and Z = GoodBye and ROWID AAAFaqAADAAAAGzAAA 824288 824288 824288 824288 insert into delete from TKYTE.T TKYTE.T(A,B,SYS NC00 where A = 1 and B = 00300004$) values Unsupported Type and (l,Unsupported SYS NC0000300004$ = Type,HEXTORAW(252cb HEXTORAW(252cb5fad8 5fad8784e2ca93eb432c 784e2ca93eb432c2d35b 2d35b7c)); 7c) and ROWID = AAAFapAADAAAARjAAA 824288 10 rows selected. Как видите, один исходнхй оператор INSERT: tkyte@TKYTE816> insert into t values (1, 2 myArrayType(myScalarType(2, sysdate, hello)), 3 myTableType(myScalarType(3, sysdate+1, GoodBye)) 4 ) ; 1 row created. б1л преобразован в два оператора INSERT: один - подчиненной (вложенной) таблицы, другой - для главной таблицы Т. LogMiner не воспроизвел один оператор INSERT -он в]дал эквивалентный набор SQL-операторов. Посмотрев на результат внимательнее, можно обнаружить в тексте оператора INSERT INTO T конструкцию Unsupported Type вместо одного из значений столбцов. Возвращаясь к исходному оператору INSERT, Пакет DBMS LOGMNR 1655 можно выяснить, что не поддерживается столбец типа VARRAY. Средства LogMiner не позволяют воспроизвести эту конструкцию. Это не делает пакеты LogMiner полностью бесполезными при работе с объектами. Просто результат нельзя использовать для отмены или повторного выполнения транзакций, поскольку соответствующие SQL-операторы воспроизводятся не полностью. Однако можно использовать результат для анализа тенденций, проверки и т.п. Более интересно, пожалуй, то, что пакеты позволяют увидеть, как сервер Oracle внутренне осуществляет поддержку объектных типов. Например, рассмотрим вставку строки в таблицу T: insert into tkyte.t (a, b, SYS NC00003000S) values .. . Вполне понятно, что такое А и В. Это столбцы типа INT и MyArrayType (VARRAY). Однако куда делся столбец С и что за столбец SYS NC0000300004$? Столбец С - это вложенная таблица, а вложенные таблицы хранятся в отдельной, подчиненной таблице. Столбец С не хранится в таблице T; он хранится в отдельной таблице. Столбец SYS NC0000300004$ - суррогатный первичный ключ для таблицы T, использующийся как внешний ключ во вложенной таблице C TBL. Если рассмотреть оператор INSERT для вставки данных во вложенную таблицу: insert into tkyte.c tbl(nested table id, x, у, z) values ... можно увидеть, что во вложенную таблицу добавлен столбец NESTED TABLE ID, использующийся для соединения со столбцом T.SYS NC0000300004$. Изучив значение, вставленное в оба эти столбца: HEXTORAW(252cb5fad8784e2ca93eb432c2d35b7c) можно выяснить, что сервер Oracle по умолчанию использует для соединения таблиц C TBL и T сгенерированное системой 16-байтовое значение типа RAW. Поэтому анализ действий с помощью LogMiner позволяет понять, как реализованы возможности сервера Oracle. В данном случае мы узнали, что тип вложенной таблицы реализуется как пара таблиц главная/подчиненная с суррогатным ключом в главной таблице и внешним ключом в подчиненной. Перемещенные или фрагментированные строки Средства LogMiner в настоящий момент не позволяют работать с перемещенными строками (migrated row) или фрагментированными строками (chained row). Фрагменти-рованной называют строку, расположенную в нескольких блоках. Перемещенной называют строку, вставленную в один блок, а затем в результате изменения выросшую настолько, что она уже не вмещается в исходном блоке и поэтому перемещена в другой блок. Идентификатор у перемещенной строки остается прежним, а в блоке, куда она первоначально вставлялась, остается указатель на новое местонахождение строки. Перемещенные строки являются специальным случаем фрагментированных строк. Это фрагментированная строка, в первом блоке которой нет данных - все данные находятся во втором блоке. Чтобы разобраться, как средства LogMiner обрабатывают фрагментированные строки, создадим одну такую строку. Начнем с таблицы, содержащей девять столбцов типа
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |