9

DB2 トリガーでは、CLOB フィールドの値を比較する必要があります。何かのようなもの:

IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD 

ただし、「!=」は CLOB の比較には機能しません。

それを比較する方法は何ですか?

追加するために編集:

更新中に Clob フィールドが変更された場合、トリガーは何らかのアクションを実行する必要があります。これが、トリガー コードで 2 つの CLOB を比較する必要がある理由です。 これをどのように行うことができるかについての詳細な情報を探しています

4

9 に答える 9

8

Oracle 10gでは、DBMS_LOB.compare()APIを使用できます。

例:

select * from table t where dbms_lob.compare(t.clob1, t.clob2) != 0

フルAPI:

DBMS_LOB.COMPARE (
   lob_1            IN BLOB,
   lob_2            IN BLOB,
   amount           IN INTEGER := 4294967295,
   offset_1         IN INTEGER := 1,
   offset_2         IN INTEGER := 1)
  RETURN INTEGER;

DBMS_LOB.COMPARE (
   lob_1            IN CLOB  CHARACTER SET ANY_CS,
   lob_2            IN CLOB  CHARACTER SET lob_1%CHARSET,
   amount           IN INTEGER := 4294967295,
   offset_1         IN INTEGER := 1,
   offset_2         IN INTEGER := 1)
  RETURN INTEGER; 

DBMS_LOB.COMPARE (
   lob_1            IN BFILE,
   lob_2            IN BFILE,
   amount           IN INTEGER,
   offset_1         IN INTEGER := 1,
   offset_2         IN INTEGER := 1)
  RETURN INTEGER;
于 2008-11-05T20:28:41.397 に答える
7

clob の md5 (またはその他の) ハッシュを計算し、これらを比較します。最初の計算は遅くなりますが、比較は速くて簡単です。これは、データの大部分が頻繁に変更されない場合に適した方法です。

md5 を計算する 1 つの方法は、トリガーで Java ステートメントを使用することです。これらを同じテーブルに保存するか (可能であれば)、単純な補助テーブルを作成します。

于 2008-09-21T17:33:40.700 に答える
6

Iglekott のアイデアは良いものですが、次の点に注意してください。

データが攻撃される可能性がある場合は、ハッシュによる比較に注意してください。現在、特定の MD5 値に対してハッシュ衝突を生成することは計算上実行可能ではありませんが、同じ MD5 を生成する 2 つの異なる入力を生成することは可能です (したがって、コードをトリガーしません)。同じ値にハッシュする同じプレフィックスを持つ 2 つの異なる文字列を生成することもできます。

この種の攻撃によってシステムの整合性が損なわれる可能性があり、それが懸念事項である場合は、他のオプションを検討する必要があります。最も簡単な方法は、単純にハッシュ関数を切り替えることです。SHA-2 には現在既知の脆弱性はありません。

これが問題にならない場合は、CRC を使用してください。ここでは、暗号化セキュリティを使用しません。このようなものがスマートボムにインストールされている場合は、暗号的に弱い機能を使用しないでください。:-)

于 2008-09-22T06:56:51.910 に答える
2

CLOB が 32K 以下の場合、VARCHAR としてキャストできます。これにより、比較、LIKE、およびさまざまな SQL 文字列関数が可能になります。

それ以外の場合は、列を追加して CLOB のハッシュを格納し、CLOB が更新されるたびにそのハッシュを最新の状態に保つようにアプリケーションを変更することを検討してください。

于 2009-06-17T00:10:06.363 に答える
1

これらの演算子は、格納方法が原因で、CLOBフィールドで使用することはできないと思います。

于 2008-09-21T11:19:53.393 に答える
0

ハッシュ値を生成して比較するのが最善の方法です。

テストされていないコードは次のとおりです。

...
declare leftClobHash integer;
declare rightClobHash integer;
set leftClobHash = (
    SELECT DBMS_UTILITY.GET_HASH_VALUE(OLD_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE 
    FROM SYSIBM.SYSDUMMY1);
set rightClobHash = (
    SELECT DBMS_UTILITY.GET_HASH_VALUE(UPDATED_ROW.CLOB_FIELD,100,1024) AS HASH_VALUE 
    FROM SYSIBM.SYSDUMMY1);

IF leftClobHash != rightClobHash
...

DBMS_UTILITY モジュールに対する EXECUTE 権限が必要であることに注意してください。提供されている SQL PL コードの詳細については、次のリンクを参照してください。

于 2012-12-09T03:34:34.767 に答える
0

その特定の列が更新された場合に起動するトリガーを宣言するだけです。

create trigger T_TRIG on T 
before update of CLOB_COL
...
于 2012-09-05T21:05:06.660 に答える
-1

DB2 は不等号を使用!=しますか? ANSI SQL 標準では、「<>等しくない」を使用します。

于 2008-11-05T20:32:45.693 に答える