Примеры проблем с данными 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;
/
Другие вопросы по тегам