SQL - Comment comparez-vous un CLOB
dans une base de données DB2 déclencheur, j'ai besoin de comparer la valeur d'un CLOB champ.
Quelque chose comme:
IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD
mais "!=" ne fonctionne pas pour comparer CLOBs.
Quel est le moyen de le comparer?
Modifiées afin d'ajouter:
Mon déclencheur doit faire une action si l'Clob champ a été modifié lors d'une mise à jour. C'est la raison pour laquelle je besoin pour comparer les 2 CLOBs dans le code du déclencheur.
Je suis à la recherche de quelques renseignements détaillés sur la façon dont cela peut être fait
Alors vous devriez probablement envisager @igelkott de réponse. C'est probablement la meilleure façon. Vous calculez la nouvelle somme de contrôle MD5 et les comparer avec l'ancienne, et si elles diffèrent, le CLOB a changé. Il y a une très petite chance qu'elle a changé et que vous avez la même somme mais ne vous inquiétez pas à ce sujet.
OriginalL'auteur Tipa Shel Or | 2008-09-21
Vous devez vous connecter pour publier un commentaire.
Dans Oracle 10g, vous pouvez utiliser DBMS_LOB.comparer() de l'API.
Exemple:
API complète:
OriginalL'auteur Brian
Calculer le md5 (ou autres) de hachage de la clobs, puis de comparer ces. Calcul Initial sera lente, mais la comparaison est facile et rapide. Cela pourrait être une bonne méthode si l'essentiel de vos données ne changent pas très souvent.
Une façon de calculer le md5 est grâce à un java déclaration dans votre déclencheur. Les enregistrer dans le même tableau (si possible) ou de construire un simple auxiliaire de la table.
OriginalL'auteur igelkott
Iglekott l'idée est bonne, avec une mise en garde:
Être prudent avec les comparer par hachage si vos données est susceptible d'être attaqué. Il n'est pas actuellement calcul est possible de générer un hash collision pour une valeur MD5, mais il est possible de générer deux entrées différentes, qui permettra de produire le même MD5 (donc pas de déclenchement de votre code). Il est également possible de générer des deux chaînes avec le même préfixe que de hachage à la même valeur.
Si ce genre d'attaque peut conduire à l'intégrité de votre système compromis, et c'est une préoccupation pour vous, vous voulez explorer d'autres options. Le plus simple serait tout simplement de commutation les fonctions de hachage SHA-2 n'a pas actuellement connus.
Si ce n'est pas une préoccupation -- l'enfer, aller à la convention. Vous n'allez pas pour la sécurité cryptographique ici. Il suffit de ne pas aller avec un point de vue cryptographique faiblesse de la fonction si ce truc s'installe sur un smartbomb, 'mkay? 🙂
OriginalL'auteur SquareCog
Si le CLOBs sont 32K ou moins, vous pouvez les jeter comme de type VARCHAR, qui permet de comparer, COMME, et divers SQL fonctions de chaîne.
Sinon, vous pouvez envisager d'ajouter une colonne pour contenir la valeur de hachage de la CLOB et de changement de la demande(s) à garder de hachage à jour chaque fois que le CLOB est mis à jour.
OriginalL'auteur Fred Sobotka
Le md5 idée est probablement le meilleur, mais une autre alternative est de créer un trigger qui déclenche uniquement lorsque votre CLOB champ est mis à jour.
Selon la diagramme de syntaxe, vous définissez le déclencheur:
C'est en supposant que votre application (ou celui qui est la mise à jour de la table) est assez intelligent pour mettre à jour le CLOB terrain que QUAND il y a eu une modification apportée à la clob champ, et pas à chaque fois que votre table est mise à jour.
OriginalL'auteur Michael Sharek
Je crois qu'il n'est pas possible d'utiliser ces types d'opérateurs sur CLOB champs, à cause de la façon dont ils sont stockés.
OriginalL'auteur Mat Mannion
Il suffit de déclarer le déclencheur si cette colonne est mise à jour.
OriginalL'auteur Paul Muller
Générer une valeur de hachage et de leur comparaison est la meilleure façon à mon humble avis.
Voici le code non testé:
Notez que vous devez EXÉCUTER privilège sur la DBMS_UTILITY module. Vous pouvez trouver plus d'informations sur la condition SQL PL code dans les liens suivants.
OriginalL'auteur
Ne DB2 utilisation
!=
pour ne pas égaux? La Norme SQL ANSI utilise<>
pour ne pas égaux.OriginalL'auteur Powerlord