Функции администратора. Управление памятью. Управление многопользовательским доступом. Экспорт и импорт данных, страница 9

·  вставка - вставка данных из внешнего файла без удаления имеющихся в таблице строк;

·  вставка с заменой - замена строк с идентичными первичными ключами на строки из внешнего файла и вставка строк из внешнего файла, имеющих оригинальные первичные ключи.

Следует иметь в виду, что структура таблицы, в которую данные импортируются, не обязательно совпадает со структурой таблицы, из которой они были импортированы, не говоря уже о том, что источником внешних данных может быть и не СУБД. Поэтому, во-первых, при вызове утилиты импорта может быть заданы имена столбцов и порядок следования значений столбцов во внешнем файле. Во-вторых, при импорте может возникать несоответствие между типом столбца таблицы и представлением данных для него во внешнем файле. Это могут быть как принципиальные несоответствия типов (например, данные для столбца числового типа представлены в виде строковой константы), так и "мягкие" несоответствия (например, длина строковой константы превышает зарезервированную длину данных в столбце или значение числовой константы превышает допустимое для типа SMALLINT). Принципиальные несоответствия приводят к отказу от импорта строки, для "мягких" несоответствий возможны более "мягкие" решения, такие как:

·  усечение записываемых данных до предельной длины;

·  замена на значения по умолчанию;

·  замена на NULL-значения.

В любом случае строки, утерянные или искаженные при импорте, должны сохраняться в отдельном файле - файле "исключений".

Для таблицы, в которую импортируются данные, могут быть определены правила целостности - такие как первичный ключ, непустые (NOT NULL) значения в столбцах, вторичные ключи и т.п. Эти правила могут не совпадать с правилами, определенными для источника данных, или не выполняться для новой конфигурации данных. Еще одна проблема импорта связана с изменением индексов. Поскольку при импорте в индексы может быть добавлено большое количество новых ключей, сбалансированность индексов может быть нарушена.

Существуют два принципиально разных варианта построения утилит импорта, по-разному решающие эти проблемы. Первое решение заключается в том, что импорт каждой новой строки производится "по полной программе", аналогичной той, которая выполняется при выполнении SQL-операторов INSERT или UPDATE - с полной проверкой целостности и модификацией индексов. Во втором варианте импорт выполняется в несколько этапов, каждый из которых охватывает все импортируемые данные: включение новых строк, построение сбалансированного индекса, минимальная проверка целостности, которая может быть выполнена в пределах одной таблицы (непустые значения и первичный ключ), полная проверка целостности (включая ссылочную целостность).

Как и в случае несоответствия по данным, строки, исключенные из импорта в результате проверки целостности должны сохраняться в файле исключений или в отдельной таблице.

Для выполнения некоторых действий (таких как перестройка индексов, проверка целостности) утилите импорта требуются дополнительные ресурсы памяти - внешней и оперативной. Объем этих ресурсов может выбираться по умолчанию или задаваться параметрами утилиты. Некоторые утилиты используют ресурсы внешней памяти из пространства временных таблиц БД.

5.3. Транзакционность экспорта-импорта

Для больших и сверхбольших таблиц процессы экспорта и импорта могут потребовать значительного времени для выполнения. При прерывании такого процесса на середине, во-первых, должно быть обеспечено сохранение целостности БД, во-вторых, желательно обеспечение возможности рестарта процесса с сохранением уже проделанной работы. Для утилиты экспорта это обеспечить нетрудно - достаточно, чтобы утилита подсчитывала и сохраняла на внешней памяти число выведенных строк. Сложнее обстоит дело с импортом, поскольку импорт изменяет содержимое таблицы. Первый вариант утилиты импорта позволяет выполнить импорт одной строки или любого заданного числа строк как законченную транзакцию. Для рестарта в этом варианте достаточно счетчика импортированных строк. Для второго варианта счетчик строк применим только на этапе загрузки, другие же этапы могут рестартовать только с начала. Следует иметь в виду, что при прерывании работы утилиты, построенной по второму варианту, БД остается в некорректном состоянии до завершения работы утилиты или выполнения специальных процедур восстановления целостности.