2016-10-20 25 views
0

2つのOracle 11gデータベース(ProducciónとTesting)を比較する必要がありますが、両方のデータベースに同じPCからアクセスすることはできません。基本的には、パッケージが同じバージョン(例では行数が同じ)にあるかどうかを知る必要があります。同じマシンから到達できない2つのOracleデータベースを比較するにはどうすればよいですか?

+1

'(all_source'またはuser/DBAのバージョンから)それぞれのソースのハッシュを取得するのは、単なる行数よりも正確な比較のためですか?または、ソースをテキストとして取り出し、他の場所と比較しますか? –

+0

興味深い。ハッシュを取得するとどういう意味ですか? – Rodrick

+0

私は、ソースコードを[ハッシュ関数で]渡すことを意味します(https://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_crypto.htm#i1002022)。たとえば、その関数に渡すために、ソースコードをCLOBにビルドする必要があります( 'dba_source'に1行ずつ格納)。 –

答えて

0

長い道のり:このコマンドを実行して、本番データベースに到達可能なPCへ

ゴー:

SELECT * 
    FROM dba_source 
    where type = 'PACKAGE' 
    and owner = 'SOME_SCHEMA' 

輸出は、たとえば、に結果Excelや何か。

他のオラクルボックスに持ち帰ります。同じコマンドを実行します。結果を別のファイルにエクスポートします。ファイル比較ツールを使用してください。

簡単な方法:

あなたが同じPCからのアクセスを得ることができ、「IF」は、Oracleのヒキガエルなどのツールを簡単に異なるデータベース間でのオブジェクトの比較を行うことができます。

+0

クイックレビューを行うには、各パッケージの行を数えるだけですか? – Rodrick

+0

SELECT名、パッケージが異なるかそうでない場合はタイプ=「パッケージ」 と所有者=「SOME_SCHEMA」 グループ名 – dvsoukup

+0

によって慎重にかかわらず、...が、これは必ずしも反映されませんDBA_SOURCE FROM(ライン) を数えます。たとえば、新しい行が生成されないようなインライン編集が可能でした。 – dvsoukup

0

行を数えるだけでなく(必ずしも多くのことを説明しているわけではありません)、各システムに格納されているソースコードのハッシュを生成し、ハッシュを手動で比較することができます。例えばテストとして作成されたシンプルなパッケージを使用して:

create or replace package p42 as 
    procedure foo(bar number); 
end p42; 
/

create or replace package body p42 as 
    procedure foo(bar number) is 
    begin 
    /* Some comment */ 
    null; 
    end foo; 
end p42; 
/

set serveroutput on 
declare 
    l_clob clob; 
    l_hash raw(64); 
begin 
    dbms_lob.createtemporary(l_clob, false); 
    for cur in (
    select text from user_source where type = 'PACKAGE BODY' and name = 'P42' 
) loop 
    dbms_lob.append(l_clob, cur.text); 
    end loop; 

    l_hash := dbms_crypto.Hash (l_clob, dbms_crypto.hash_sh1); 
    dbms_lob.freetemporary(l_clob); 

    dbms_output.put_line(l_hash); 
end; 
/

57853368B7B4CBBA53F17A50833C1DC2DF8C666A 


PL/SQL procedure successfully completed. 

私は、パッケージ本体を変更する場合は、ここでは単にコメント文字列の「s」を追加し、私は別のハッシュを取得:

create or replace package body p42 as 
    procedure foo(bar number) is 
    begin 
    /* Some comments */ 
    null; 
    end foo; 
end p42; 
/

同じ無名ブロックを実行すると、次のようになります。

24E49A4C55E036FFD34D8A01295A6514E1AAD0FD 


PL/SQL procedure successfully completed. 

ハッシュ値が異なる場合、ソースが異なります。衝突の可能性は常にありますが、このシナリオではほとんど起こりません。

は何ですか、とは異なります。コードを抽出し、それをより詳細に比較する必要があります。しかし、あなたが期待していることがかなり簡単で簡単なチェックとして、これは簡単です。

+0

PLS-00201を取得しました。識別子 'DBMS_CRYPTO'を宣言する必要があります。 – Rodrick

+0

Mmm、デフォルトでパブリックではないか、パブリック・シノニムがセキュリティ対策として削除されていると推測されます。あなたのDBAはあなたにそれを実行する権限を与えなければならないかもしれません。政治的に問題があるかもしれないし、そうでないかもしれない... –

関連する問題