SQL - Wie vergleicht man einen CLOB?

8

In einem DB2-Trigger muss ich den Wert eines CLOB-Felds vergleichen. Etwas wie:

%Vor%

aber "!=" funktioniert nicht zum Vergleichen von CLOBs.

Wie vergleichen Sie es?

Bearbeitet zum Hinzufügen:

Mein Trigger muss etwas tun, wenn das Feld "Clob" während eines Updates geändert wurde. Dies ist der Grund, warum ich die 2 CLOBs im Triggercode vergleichen muss. Ich bin auf der Suche nach detaillierten Informationen darüber, wie das gemacht werden kann

    
Tipa Shel Or 21.09.2008, 09:04
quelle

9 Antworten

8

In Oracle 10g können Sie die DBMS_LOB.compare () API verwenden.

Beispiel:

%Vor%

Vollständige API:

%Vor%     
Brian Hart 05.11.2008 20:28
quelle
7

Berechnen Sie den md5 (oder einen anderen) Hash der Clobs und vergleichen Sie diese. Die anfängliche Berechnung wird langsam sein, aber der Vergleich ist schnell und einfach. Dies könnte eine gute Methode sein, wenn sich der Großteil Ihrer Daten nicht sehr oft ändert.

Eine Möglichkeit, md5 zu berechnen, ist eine Java-Anweisung in Ihrem Trigger. Speichern Sie diese in der gleichen Tabelle (wenn möglich) oder erstellen Sie eine einfache Hilfstabelle.

    
igelkott 21.09.2008 17:33
quelle
6

Iglekotts Idee ist eine gute, mit einem Vorbehalt:

Seien Sie vorsichtig beim Hash-Vergleich, wenn Ihre Daten wahrscheinlich angegriffen werden. Es ist derzeit nicht rechnerisch möglich, eine Hash-Kollision für einen bestimmten MD5-Wert zu generieren, aber es ist möglich, zwei verschiedene Eingaben zu generieren, die dasselbe MD5 erzeugen (und daher Ihren Code nicht auslösen). Es ist auch möglich, zwei verschiedene Zeichenfolgen mit demselben Präfix zu generieren, die denselben Wert hashen.

Wenn diese Art von Angriff dazu führen kann, dass die Integrität Ihres Systems beeinträchtigt wird, und das ist ein Problem, möchten Sie andere Optionen erkunden. Am einfachsten wäre es, die Hash-Funktionen zu wechseln, da SHA-2 keine bekannten Sicherheitslücken aufweist.

Wenn das kein Problem ist - Hölle, gehen Sie mit CRC. Sie gehen hier nicht auf kryptografische Sicherheit. Geh einfach nicht mit einer kryptographisch schwachen Funktion, wenn dieses Zeug auf einer Smartbomb installiert wird, 'mkay? : -)

    
SquareCog 22.09.2008 06:56
quelle
2

Wenn die CLOBs 32 KB oder weniger sind, können Sie sie als VARCHAR umwandeln, was Vergleich, LIKE und verschiedene SQL-String-Funktionen ermöglicht.

Andernfalls sollten Sie in Erwägung ziehen, eine Spalte hinzuzufügen, die den Hash des CLOB enthält, und die Anwendung (en) so zu ändern, dass dieser Hash immer dann aktualisiert wird, wenn der CLOB aktualisiert wird.

    
Fred Sobotka 17.06.2009 00:10
quelle
2

Die md5-Idee ist wahrscheinlich die beste, aber eine andere Alternative besteht darin, einen speziellen Trigger zu erstellen, der nur ausgelöst wird, wenn Ihr CLOB-Feld aktualisiert wird.

Laut Syntaxdiagramm , würden Sie den Trigger wie folgt definieren:

%Vor%

Dies setzt voraus, dass Ihre Anwendung (oder wer immer die Tabelle aktualisiert) intelligent genug ist, das CLOB-Feld NUR zu aktualisieren, wenn eine Änderung am Clob-Feld vorgenommen wurde, und nicht jedes Mal, wenn Ihre Tabelle aktualisiert wird.

    
Michael Sharek 17.06.2009 15:07
quelle
1

Ich glaube, es ist nicht möglich, diese Art von Operatoren für CLOB-Felder zu verwenden, weil sie so gespeichert sind.

    
Mat Mannion 21.09.2008 11:19
quelle
0

Deklarieren Sie den Trigger nur, wenn diese bestimmte Spalte aktualisiert wird.

%Vor%     
Paul Muller 05.09.2012 21:05
quelle
0

Einen Hash-Wert zu generieren und sie zu vergleichen, ist der beste Weg, IMHO.

Hier ist der ungeprüfte Code:

%Vor%

Beachten Sie, dass Sie EXECUTE-Berechtigung für das Modul DBMS_UTILITY benötigen. In den folgenden Links finden Sie weitere Informationen zum bereitgestellten SQL-PL-Code.

Ramazan Polat 09.12.2012 03:34
quelle
-1

Verwendet DB2 != für nicht gleich? Der ANSI SQL-Standard verwendet <> für nicht gleich.

    
Powerlord 05.11.2008 20:32
quelle

Tags und Links