2

そこで、Java ベースのデータ変換 / マスキング ツールを用意しました。これを Oracle 10g でテストしたかったのです。Oracle 10g の良いところは、いくつかのサンプル スキーマに 50 万件のレコードが含まれていることです。スキーマは、SH、OE、HR、IX などです。10g をインストールしたところ、インストール スクリプトが ORACLE_HOME/demo/scripts の下にあることがわかりました。

これらのスクリプトをバッチ モードで実行するように少しカスタマイズしました。これで、データ変換ソフトウェアをテストするためのソース データを作成するという私の要件の半分が解決されました。要件の後半は、同じスキーマを異なる名前 (TR_HR、TR_OE など...) でデータなしで作成することです。これらのスキーマは、ターゲット スキーマを表します。つまり、私のソフトウェアはスキーマ内のテーブルからデータを取得し、別のスキーマ内の同じテーブルにロードします。

ここで、ターゲット スキーマを作成して空にする際に 2 つの問題があります。

  • バッチジョブでこれが欲しいです。ただし、入手した oracle スクリプトのサンプル スキーマ名は構成できません。そこで、OE を TR_OE に、HR を TR_HR に置き換えて、スクリプトを作成してみました。ただし、このアプローチは、サンプル スキーマの作成方法がやや複雑であるため、やや苛立たしいものです。オラクルはシノニム、ビュー、具体化されたビュー、データ型、および多くの奇妙なものを作成します。
  • ターゲット スキーマ (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

そして... それは助けにはなりませんでした。行= n属性にもかかわらず、スキーマは行データで作成されました:(

4

2 に答える 2

5

.dmp ファイルを使用する Oracle スクリプトの exp/imp (または expdp/impdp) には既に慣れているので、次のようにしてください。

  • 空の TR_xxx スキーマを作成します
  • FROMUSER/TOUSER オプションと ROWS=N を使用して、xxx​​ .dmp ファイルから TR_xxx スキーマを作成します (expdp/impdp にも同様のオプションがあります)。

[トランスポータブル表領域に関するコメントを読んだ後に編集]

Oracle スクリプトがトランスポータブル テーブルスペースを使用していることや、1 つのファイルから複数のスキーマがインポートされていることを知りませんでした。これはおそらく、新しい空の TR スキーマを作成する最も簡単な方法です。

  • Oracle スクリプトを使用して構築された、データが入力された標準のデータベースから始めます。

  • 次の方法で、スキーマごとにデータのないエクスポート ファイルを作成します(OE を表示)。

    exp sys/&&password_sys AS SYSDBA file=oe_nodata.dmp log=oe_nodata_exp.log owner=OE 行=N grants=N

    (これは 1 回だけ実行する必要があり、この dmp ファイルは再利用できます)

これで、スクリプトは次のようになります。


  • CASCADEオプションを使用して TR_ ユーザーを削除する
  • TR_ ユーザーを再作成します
  • 次の方法でスキーマ オブジェクト (OE
    を表示) を設定します。

    host imp "'sys/&&password_sys AS SYSDBA'" file=oe_nodata.dmp log=tr_oe_imp.log fromuser=OE touser=TR_OE

于 2010-03-29T11:49:00.610 に答える
1

これは、特定のスキーマに対して、トリガーと外部キーを無効にし、すべてのテーブルを切り捨ててから、トリガーと外部キーを再度有効にする anonymos ブロックです。速度のために使用truncate しますが、明らかにこれはロールバックがないことを意味します。したがって、指定するスキーマ名に注意してください! delete from必要に応じて、その呼び出しをステートメントに変換するのは簡単です。

このスクリプトはカット アンド ペースト プログラミングの良い例であり、リファクタリングを行って繰り返しを削除することでメリットが得られることは間違いありません。

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;
/
于 2010-03-29T11:03:50.543 に答える