Примеры проблем с данными Oracle
Итак, у меня есть этот инструмент преобразования / маскирования данных на основе Java, который я хотел протестировать в Oracle 10g. Преимущество Oracle 10g состоит в том, что вы получаете множество примеров схем с полмиллиона записей в некоторых. Схемы: SH, OE, HR, IX и т. Д. Итак, я установил 10g и обнаружил, что установочные сценарии находятся в каталоге ORACLE_HOME/demo/scripts.
Я немного настроил эти скрипты для запуска в пакетном режиме. Это решает половину моего требования - создавать исходные данные для моего тестирования моего программного обеспечения для преобразования данных. Вторая половина требования заключается в том, что я создаю одни и те же схемы под разными именами (TR_HR, TR_OE и т. Д.) Без каких-либо данных. Эти схемы будут представлять мои целевые схемы. Короче говоря, мое программное обеспечение будет собирать данные из таблицы в схеме и загружать их в ту же таблицу в другой схеме.
Теперь у меня есть две проблемы в создании моей целевой схемы и ее очистке.
- Я хотел бы это в пакетной работе. Но скрипты оракула, которые вы получаете, примеры имен схем не настраиваются. Итак, я попытался создать скрипт, заменив OE на TR_OE, HR на TR_HR и так далее. Тем не менее, этот подход является своего рода раздражающим, потому что типовые схемы довольно сложны в том, как они создаются; Oracle создает синонимы, представления, материализованные представления, типы данных и массу странных вещей.
- Я хотел бы, чтобы целевые схемы (TR_HR, TR_OE,...) были пустыми. Но некоторые схемы имеют циклические ссылки, которые не позволяют мне удалять данные. Похоже, единственное обходное решение заключается в удалении определенных внешних ключей, удалении данных и последующем добавлении ограничений обратно.
Есть ли легкий путь ко всему этому, без всякой суеты? Мне понадобится сложный набор данных для моего тестирования (сложный, как в таблицах с триггерами, несколькими иерархиями... например... дочерняя таблица, которая имеет дочерние элементы до 5 уровней, родительская таблица, которая ссылается на таблицу IOT и таблицу IOT это относится к не-IOT таблице и т. д.). Примеры схем практически идеальны с точки зрения набора данных. Единственная проблема, которую я вижу, состоит в том, чтобы автоматизировать весь этот процесс загрузки исходных схем, а затем создать целевые схемы и очистить их. Ценю вашу помощь и предложения.
ОБНОВИТЬ
Основной сценарий, который требуется запустить для ручной установки примеров схем Oracle, - это mkplug.sql. Вот строка, которая загружает схемы из файла dmp:
host imp "'sys/&&password_sys AS SYSDBA'" transport_tablespace=y file=&imp_file log=&imp_logfile datafiles='&datafile' tablespaces=EXAMPLE tts_owners=hr,oe,pm,ix,sh
Ну, я попытался изменить эту строку (после исправления проблем, связанных с путями в mkplug.sql и всех других файлах sql) к этому:
host imp "'sys/&&password_sys AS SYSDBA'" rows=n transport_tablespace=y file=&imp_file log=&imp_logfile datafiles='&datafile' tablespaces=EXAMPLE tts_owners=hr,oe,pm,ix,sh
И... это не помогло. Схема была создана с данными строк, несмотря на атрибут row =n:(
2 ответа
Поскольку вы уже знакомы с exp/imp (или expdp/impdp) из сценариев Oracle, которые используют файл.dmp, почему бы не просто:
- Создайте пустые схемы TR_xxx
- Заполните схему TR_xxx из файла xxx.dmp с параметрами FROMUSER/TOUSER и ROWS=N (аналогичные параметры существуют для expdp/impdp)
[Изменить после прочтения вашего комментария о переносимых табличных пространствах]
Я не знал, что сценарии Oracle используют переносимые табличные пространства и что из одного файла импортируются несколько схем. Это, вероятно, самый простой способ создания новых пустых схем TR:
- Начните со стандартной, заполненной базы данных, созданной с помощью сценариев Oracle
Создание файлов экспорта без данных на
Основа схемы за схемой (показана OE):exp sys / && password_sys AS SYSDBA file = oe_nodata.dmp log = oe_nodata_exp.log владелец =OE строк = N грантов = N
(Вы должны сделать это только один раз, и этот dmp-файл можно использовать повторно)
Теперь ваш скрипт должен:
- Отбросьте всех пользователей TR_ с помощью CASCADE
вариант - Пересоздайте пользователей TR_
Заполните объекты схемы (OE
показано):host imp "'sys / && password_sys AS SYSDBA'" file = oe_nodata.dmp log = tr_oe_imp.log fromuser =OE touser = TR_OE
Вот блок анонимов, который - для данной схемы - отключает триггеры и внешние ключи, усекает все таблицы и затем повторно включает триггеры и внешние ключи. Оно использует truncate
для скорости, но, очевидно, это означает отсутствие отката: поэтому будьте осторожны, какое имя схемы вы предоставляете! Достаточно просто преобразовать этот вызов в delete from
Скажите, если вы предпочитаете.
Скрипт является прекрасным примером программирования cut'n'paste и, несомненно, выиграет от некоторого рефакторинга для удаления повторения.
begin
<< dis_triggers >>
for trgs in ( select owner, trigger_name
from all_triggers
where table_owner = '&&schema_name' )
loop
execute immediate 'alter trigger '||trgs.owner||'.'||trgs.trigger_name
||' disable';
end loop dis_triggers;
<< dis_fkeys >>
for fkeys in ( select owner, table_name, constraint_name
from all_constraints
where owner = '&&schema_name'
and constraint_type = 'R')
loop
execute immediate 'alter table '||fkeys.owner||'.'||fkeys.table_name
||' disable constraint '||fkeys.constraint_name;
end loop dis_fkeys;
<< zap_tables >>
for tabs in ( select owner, table_name
from all_tables
where owner = '&&schema_name' )
loop
execute immediate 'truncate table '||tabs.owner||'.'||tabs.table_name
||' reuse storage';
end loop zap_tables;
<< en_fkeys >>
for fkeys in ( select owner, table_name, constraint_name
from all_constraints
where owner = '&&schema_name'
and constraint_type = 'R')
loop
execute immediate 'alter table '||fkeys.owner||'.'||fkeys.table_name
||' enable constraint '||fkeys.constraint_name;
end loop en_fkeys;
<< en_triggers >>
for trgs in ( select owner, trigger_name
from all_triggers
where table_owner = '&&schema_name' )
loop
execute immediate 'alter trigger '||trgs.owner||'.'||trgs.trigger_name
||' enable';
end loop en_triggers;
end;
/