Таблицы имп Oracle не работают из-за ограничений - PullRequest
0 голосов
/ 08 декабря 2011

Я использую утилиту Oracle imp для импорта данных в набор пустых таблиц в Oracle 10g. Когда я пытаюсь выполнить импорт, большая часть его завершается неудачей из-за ограничений ссылочной целостности. Например. Невозможно импортировать данные в таблицу A, поскольку внешний ключ в таблице B еще не существует.

Вот моя команда импорта:

imp C_PLUS/<password> rows=y file=db.dmp ignore=y FROMUSER=C_PLUS 
TOUSER=C_PLUS tables=...

Я мог бы вручную просмотреть каждую таблицу при импорте, а в случае неудачи сначала импортировать отсутствующую таблицу, но у меня есть более 400 таблиц, которые необходимо импортировать, и это займет слишком много времени.

Есть ли способ обойти это или у кого-нибудь есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Поскольку вы хотите, чтобы каждая таблица принадлежала C_PLUS, вы можете опустить предложение TABLES. Просто укажите FROMUSER. Вы также можете опустить параметр TOUSER, поскольку вы не изменяете имя схемы, но это не повлияет на поведение импорта. Отказ от предложения TABLES должен устранить проблему с ограничениями, предполагая, что все ограничения внешнего ключа ссылаются на другие таблицы в той же схеме, и предполагая, что данные в файле экспорта позволяют включать ограничения (если экспорт был выполнен без установки CONSISTENT=Y, в файле дампа могут быть потерянные строки, которые, например, не позволят создать ограничения).

0 голосов
/ 08 декабря 2011

Для каждой таблицы вы можете отключить ограничения первичного ключа / внешнего ключа перед импортом. Затем включите все ограничения первичного и внешнего ключей после импорта.

Отключить ограничения

ALTER TABLE table_name DISABLE PRIMARY KEY CASCADE;

Включить ограничение

ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

Если количество таблиц и количество ограничений слишком велики, чтобы сделать это вручную, вы можете написать сценарии для генерации команд ALTER TABLE с использованием представлений словаря данных.

Отключить ограничения PK / FK

SELECT 'ALTER TABLE '||table_name||' DISABLE PRIMARY KEY CASCADE' sql_statement
FROM USER_TABLES;

Включить ограничение PK

SELECT 'ALTER TABLE '||table_name||' ENABLE CONSTRAINT '||constraint_name sql_statement
FROM USER_CONSTRAINTS
where constraint_type ='P';

Включить ограничение FK

SELECT 'ALTER TABLE '||table_name||' ENABLE CONSTRAINT '||constraint_name sql_statement
FROM USER_CONSTRAINTS
where constraint_type ='R';
...