2010-03-29 2 views
2

Итак, у меня есть этот инструмент преобразования/маскирования данных на основе Java, который я хотел протестировать на Oracle 10g. Хорошая часть с Oracle 10g заключается в том, что вы получаете загрузку типовых схем с полмиллиона записей в некоторых. Схемы: SH, OE, HR, IX и т. Д. Итак, я установил 10g, выяснил, что сценарии установки находятся под ORACLE_HOME/demo/scripts.Примеры данных выборки Oracle

Я настроил эти скрипты для запуска в пакетном режиме. Это решает половину моего требования - создавать исходные данные для моего тестирования моего программного обеспечения для преобразования данных. Вторая половина требования заключается в том, что я создаю те же схемы под разными именами (TR_HR, TR_OE и т. Д.) Без каких-либо данных. Эти схемы будут представлять мои целевые схемы. Короче говоря, мое программное обеспечение собирает данные из таблицы в схеме и загружает их в одну и ту же таблицу в другой схеме.

Теперь у меня есть две проблемы при создании моей целевой схемы и ее опустошении.

  • Мне бы хотелось это в пакетной работе. Но скрипты oracle, которые вы получаете, имена схем схемы не настраиваются. Итак, я попытался создать сценарий, заменив OE на TR_OE, HR с TR_HR и так далее. Однако этот подход является своего рода раздражающим, поскольку схемы выборок являются сложными в том, как они создаются; Oracle создает синонимы, представления, материализованные представления, типы данных и много странных вещей.
  • Я хотел бы, чтобы целевые схемы (TR_HR, TR_OE, ...) были пустыми. Но некоторые из схем имеют круглые ссылки, которые не позволяют мне удалять данные. Единственная работа, по-видимому, заключается в удалении некоторых внешних ключей, удалении данных и последующем добавлении ограничений.

Есть ли простой способ для всего этого, без всякой этой суеты? Мне понадобится сложный набор данных для моего тестирования (сложный, как в таблицах с триггерами, несколькими иерархиями .. например .. дочерняя таблица с детьми до 5 уровней, родительская таблица, которая ссылается на таблицу IOT и таблицу IOT это относится к таблице, отличной от IOT и т. д.). Схемы выборки почти идеальны с точки зрения набора данных. Единственная проблема, которую я вижу, - автоматизировать весь этот процесс загрузки исходных схем, а затем создать целевые схемы и опорожнить их. Цените свою помощь и предложения.


UPDATE

Основной сценарий, который требуется для запуска для ручной установки схемы оракул образца является 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 

И ... это было NOT помощь. Схема была создана с данными строки, несмотря на то, что row = n attribute :(

+0

Вам просто нужна альтернативная версия скриптов, которые создают объекты схемы, но не заполняют их данными? Не можете ли вы просто удалить все инструкции INSERT? –

+0

@Jeffrey nope. образец сценария sql загружается из файла .dmp. (файл данных). В сценариях образца нет вставок statetements. – Jay

ответ

5

Поскольку вы уже знакомы с ехр/имп (или EXPDP/impdp) из сценариев Oracle, которые используют файл .dmp, почему бы не просто:

  • Создать пустые схемы TR_xxx
  • Заполняют схемы TR_xxx из ххх .dmp файла с FROMUSER/TOUSER опции и ROWS = N (аналогичные варианты существуют для EXPDP/impdp)

[Редактировать после прочтения вашего комментария о транспортабельных табличных]

Я не знал, что сценарии Oracle используют переносимые табличные и что несколько схемы были импортированы из одного файла. Это, вероятно, самый простой способ создать новый пустой TR схемы:

  • Start со стандартом, заселена база данных построена с Oracle сценариев
  • не чинят-данных экспорта файлов на
    схеме -по-схемы базис (О.Е. показан):

    ехр SYS/& & password_sys AS SYSDBA файл = oe_nodata.dmp лог = oe_nodata_exp.log владелец = OE строк = N гранты = N

    (Вы должны иметь только сделать это один раз и этот DMP файл может быть повторно)

Теперь, ваш сценарий должен:

  • Отбросьте все пользователи TR_ с КАСКАД
    вариант
  • Пересоздайте пользователей TR_
  • Поп Улате объектов схемы (OE
    показано):

    хозяина имп " 'SYS/& & password_sys AS SYSDBA'" Файл = oe_nodata.dmp лог = tr_oe_imp.log fromuser = OE touser = TR_OE

+0

проблема заключается в создании схем TR_XXX. Как вы сказали, мне придется загрузить мои схемы TR_xxx из файлов xxx.dmp, а затем удалить в них данные. Удаление данных - самая сложная часть - некоторые схемы имеют циклические ссылки, для этого мне потребуется отключить ограничения внешнего ключа и включить их, как только данные будут удалены. Короче говоря, это очень болезненный подход. – Jay

+0

Параметр ROWS = N будет создавать только объекты Oracle (таблицы, индексы, представления и т. Д.), Но не вставлять какие-либо данные. «Создайте пустую схему», я имел в виду просто создать пользователя/схему Oracle без каких-либо объектов, то есть «СОЗДАТЬ ПОЛЬЗОВАТЕЛЬ TR_OE ИДЕНТИФИЦИРОВАН ПО mypassword» – dpbradley

+0

ROWS = N звучит круто, я дам вам снимок и сообщение и обновить – Jay

1

Вот блок анонимного кода, который - для данной схемы - отключает триггеры и внешние ключи, обрезает все таблицы, а затем снова включает триггеры и внешние ключи Он использует 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; 
/
+0

@ APC Думаю, я могу сделать это. Знаете ли вы, что любой пользователь может использовать общедоступные наборы данных, которые имеют сложную структуру таблицы (такие как таблицы IOT, таблицы без IOT, глубина в дочерних таблицах родителя, IOT, ссылающиеся на не-IOT и наоборот) и т. Д.)? – Jay

Смежные вопросы