O2SS0028: ROWID созданный столбец (Info)
В этой статье описывается причина, по которой помощник по миграции SQL Server (SSMA) для Oracle добавляет ROWID столбец в таблицу, если есть триггеры.
Общие сведения
В Oracle можно создать триггер, который будет выполняться FOR EACH ROW , а не для всего набора строк, изменяющихся. Триггеры SQL Server всегда выполняются для всего набора измененных строк. Если на уровне строк Oracle активирует доступ как к специальным переменным, :old так и :new к специальным переменным, SSMA требуется способ сопоставления строк из обоих наборов строк, чтобы определить, какое значение было для заданной строки до и после обновления. Чтобы эмулировать такие функции «для каждой строки», SSMA добавляет специальный ROWID столбец для уникальной идентификации каждой измененной строки и использует ее для установления связи между inserted наборами deleted строк.
пример
Рассмотрим следующий триггер Oracle, который выполняется для каждой строки, обновленной в TRIG_TEST таблице:
CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST FOR EACH ROW BEGIN IF (:new.DATA = 'ABC') THEN INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || :old.DATA); END IF; END;
При попытке преобразовать этот триггер в SSMA в триггере SQL Server будет создан следующий T-SQL:
-
Запустите курсор над inserted набором строк, выберите ROWID и DATA столбцы в @new$0 и @new$DATA переменные:
DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT ROWID, DATA FROM inserted OPEN ForEachInsertedRowTriggerCursor FETCH ForEachInsertedRowTriggerCursor INTO @new$0, @new$DATA
SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
IF (@new$DATA = 'ABC') INSERT SSMAADMIN.TRIG_TEST(DATA) VALUES (('-' + ISNULL(@old$DATA, '')))
Дополнительная информация
Это поведение управляется параметром проекта столбца ROWID, который можно найти в разделе — «Параметры — проекта» — общего преобразования — ROWID. Если для параметра задано значение No, но во время преобразования триггера SSMA определяет, что для него требуется ROWID столбец, будет создана ошибка преобразования O2SS0239 .
Связанные сообщения преобразования
- O2SS0239: столбец ROWID недоступен
- O2SS0267: столбец ROWID
- O2SS0404: невозможно преобразовать столбец ROWID
Обратная связь
Были ли сведения на этой странице полезными?
Индексы ROWID в Oracle
Индексы ROWID — это объекты базы данных, обеспечивающие отображение всех значений столбца таблицы, а также идентификаторов ROWID всех строк таблицы, в которых содержатся значения столбца.
ROWID — это псевдостолбец, который является уникальным идентификатором строки в таблице и фактически описывает точное физическое расположение данной конкретной строки. На основе этой информации Oracle впоследствии может найти данные, связанные со строкой таблицы. При каждом перемещении, экспорте, импорте строки, а также при выполнении любых других операций, которые приводят к изменению ее местонахождения, изменяется ROWID строки, поскольку она занимает другое физическое положение. Для хранения данных ROWID требуется 80 бит (10 байт). Идентификаторы ROWID состоят из четырех компонентов: номера объекта (32 бита), относительного номера файла (10 бит), номера блока (22 бита) и номера строки (16 бит). Эти идентификаторы отображаются как 18-символьные последовательности, указывающие местонахождение данных в БД, причем каждый символ представлен в формате base-64, состоящем из символов A-Z, a-z, 0-9, + и /. Первые шесть символов – это номер объекта данных, следующие три – относительный номер файла, следующие шесть – номер блока, последние три – номер строки.
Пример:
SELECT fam, ROWID FROM student;
FAM ROWID
——————————————
ИВАНОВ AAAA3kAAGAAAAGsAAA
ПЕТРОВ AAAA3kAAGAAAAGsAAB
В базе данных Oracle индексы используются для разных целей: для обеспечения уникальности значений в базе данных, для повышения производительности поиска записей в таблице и др. Производительность повышается благодаря тому, что в критерии поиска данных в таблице включается ссылка на индексированный столбец или столбцы. В Oracle индексы можно создавать по любому столбцу таблицы, кроме столбцов типа LONG. Индексы проводят различие между приложениями, для которых скорость не важна, и интенсивно функционирующими приложениями, что особенно касается работы с большими таблицами. Однако, прежде чем принять решение о создании индекса, необходимо взвесить все «за» и «против» в отношении производительности системы. Производительность не повысится, если просто ввести индекс и забыть о нем.
Рекомендации по созданию индексов ROWID:
Хотя наибольшее повышение производительности достигается созданием индекса по столбцу, все значения которого уникальны, похожий результат можно получить и для столбцов, содержащих одинаковые значения или NULL-значения. Для создания индекса совсем не обязательно, чтобы значения столбца были уникальны. Приведем ряд рекомендаций, обеспечивающих нужное повышение производительности при использовании стандартного индекса, а также рассмотрим вопросы, связанные с балансом между производительностью и расходованием дискового пространства при создании индекса.
Использование индексов для поиска информации в таблицах может дать значительное повышение производительности по сравнению с просмотром таблиц, столбцы которых неиндексированы. Однако выбрать правильный индекс совсем непросто. Конечно, для индексирования с помощью индекса В-дерева предпочтителен столбец, все значения которого уникальны, но и столбец, не отвечающий этим требованиям,— неплохой кандидат, если только одинаковые значения содержатся примерно в 10% его строк и никак не более. Столбцы-«переключатели», или «флаги», например те в которых хранятся сведения о поле человека, для индексов В-дерева не годятся Не подходят и те столбцы, которые используются для хранения небольшого числа «достоверных значений», а также хранящие какие-то признаки, например «достоверность» или «недостоверность», «активность» или «неактивность», «да» или «нет» и т. д, и т. п. Наконец, индексы с обратными ключами применяются, как правило, там, где установлен и функционирует Oracle Parallel Server и нужно до максимума повысить уровень параллельности в базе данных.
DeepEdit!
ROWID Тип PL/SQL ROWID абсолютно аналогичен типу, используемому для работы с псевдостолбцами ROWID базы данных. Он дает возможность сохранять идентификаторы строк которые можно рассматривать в качестве ключей, однозначно определяющих каждую строку базы данных. Идентификаторы строк хранятся внутри базы данных в виде двоичных значений фиксированной длины, размер которых зависит от используемой операционной системы. Для работы с идентификаторами их можно преобразовать в последовательности символов при помо-
щи встроенной функции ROWIDTOCHAR. Результатом работы этой функции является последовательность, имеющая в
формат:
BBBBBBBB.RRRR.FFFF
где определяет блок в файле базы данных, RRRR — строку в
блоке, a FFFF — номер файла. Каждый элемент идентификатора строки
представлен в виге числа. Например, идентификатор
0000001E.OOFF.0001
указывает на 30-й блок, 255-ую строку в этом блоке, который расположен в файле 1. В базах данных и выше идентификатор строки rowid
использует расширенный формат, который также является 18-символьной строкой, редставляющей значение в записи base-64. Компоненты расширенного формата rowid можно определить с помощью модуля DBMS_ROWID, описанного в приложении А.
Идентификаторы строк обычно не создаются программами PL/SQL; они выбираются из псевдостолбца ROWID таблицы. Выбранное значение может быть использовано в предложении WHERE последующего оператора UPDATE или DELETE.
UROWID Хотя каждая строка в таблице, доступной в базе данных Oracle, имеет адрес, это может быть не физический адрес. Например, строки
в индексно-организованных таблицах имеют логический rowid, который основывается на первичном ключе таблицы. Таблицы в базах данных, отличных от Oracle, но доступных через шлюз, также имеют логические
rowid. Тип данных UROWID может содержать как физический rowid (т.е. типа ROWID), так и логический rowid. Oracle рекомендует использовать UROWID в новых приложениях, так как он является более гибким.
Дополнительную информацию о логических rowid и индексно-организованных таблицах можно найти в «Oracle Concepts».
Типы данных
Ниже перечислены символьные типы данных в Oracle/PLSQL:
| Типы данных | Размер | Описание |
|---|---|---|
| char(размер) | Максимальный размер 2000 байт. | Где размер — количество символов фиксированной длины. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка. |
| nchar(размер) | Максимальный размер 2000 байт. | Где размер — количество символов фиксированной длины в кодировке Unicode. Если сохраняемое значение короче, то дополняется пробелами; если длиннее, то выдается ошибка. |
| nvarchar2(размер) | Максимальный размер 4000 байт. | Где размер – количество сохраняемых символов в кодировке Unicode переменной длины. |
| varchar2(размер) | Максимальный размер 4000 байт. Максимальный размер в PLSQL 32KB. | Где размер – количество сохраняемых символов переменной длины. |
| long | Максимальный размер 2GB. | Символьные данные переменной длины. |
| raw | Максимальный размер 2000 байт. | Содержит двоичные данные переменной длины |
| long raw | Максимальный размер 2GB. | Содержит двоичные данные переменной длины |
Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c
Числовые типы данных
Ниже приведены числовые типы данных в Oracle/PLSQL:
| Типы данных | Размер | Описание |
|---|---|---|
| number(точность,масштаб) | Точность может быть в диапазоне от 1 до 38. Масштаб может быть в диапазоне от -84 до 127. |
Например,number (14,5) представляет собой число, которое имеет 9 знаков до запятой и 5 знаков после запятой. |
| numeric(точность,масштаб) | Точность может быть в диапазоне от 1 до 38. | Например, numeric(14,5) представляет собой число, которое имеет 9 знаков до запятой и 5 знаков после запятой. |
| dec(точность,масштаб) | Точность может быть в диапазоне от 1 до 38. | Например, dec (5,2) — это число, которое имеет 3 знака перед запятой и 2 знака после . |
| decimal(точность,масштаб) | Точность может быть в диапазоне от 1 до 38. | Например, decimal (5,2) — это число, которое имеет 3 знака перед запятой и 2 знака после . |
| PLS_INTEGER | Целые числа в диапазоне от -2,147,483,648 до 2,147,483,647 |
Значение PLS_INTEGER требуют меньше памяти и быстрее значений NUMBER |
Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c
Дата/время типы данных
Ниже приведены типы данных дата/время в Oracle/PLSQL:
| Типы данных | Размер | Описание |
|---|---|---|
| date | date может принимать значения от 1 января 4712 года до н.э. до 31 декабря 9999 года нашей эры. |
Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c
Большие объекты (LOB) типы данных
Ниже перечислены типы данных LOB в Oracle/PLSQL:
| Типы данных | Размер | Описание |
|---|---|---|
| bfile | Максимальный размер файла 4 ГБ. | Файл locators, указывает на двоичный файл в файловой системе сервера (вне базы данных). |
| blob | Хранит до 4 ГБ двоичных данных. | Хранит неструктурированные двоичные большие объекты. |
| clob | Хранит до 4 ГБ символьных данных. | Хранит однобайтовые и многобайтовые символьные данные. |
| nclob | Хранит до 4 ГБ символьных текстовых данных. | Сохраняет данные в кодировке unicode. |
Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c
Rowid тип данных
Ниже перечислены типы данных Rowid в Oracle/PLSQL:
| Типы данных | Формат | Описание |
|---|---|---|
| rowid | Формат строки: BBBBBBB.RRRR.FFFFF, Где BBBBBBB — это блок в файле базы данных; RRRR — строка в блоке; FFFFF — это файл базы данных. | Двоичные данные фиксированной длины. Каждая запись в базе данных имеет физический адрес или идентификатор строки (rowid). |
Булевы (BOOLEAN) типы данных
| Типы данных | Формат | Описание |
|---|---|---|
| BOOLEAN | TRUE или FALSE. Может принимать значение NULL | Хранит логические значения, которые вы можете использовать в логических операциях. |
Применение: Oracle 9i, Oracle 10g, Oracle 11g, Oracle 12c


