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
In Oracle 10g können Sie die DBMS_LOB.compare () API verwenden.
Beispiel:
%Vor%Vollständige API:
%Vor%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.
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? : -)
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.
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.
Ich glaube, es ist nicht möglich, diese Art von Operatoren für CLOB-Felder zu verwenden, weil sie so gespeichert sind.
Deklarieren Sie den Trigger nur, wenn diese bestimmte Spalte aktualisiert wird.
%Vor%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.