在DB2触发器中,我需要比较CLOB字段的值.就像是:
IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD
但"!="不适用于比较CLOB.
比较它的方法是什么?
编辑添加:
如果在更新期间更改了Clob字段,则我的触发器需要执行某些操作.这就是我需要比较触发器代码中的2个CLOB的原因. 我正在寻找有关如何做到这一点的一些详细信息
在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;
计算clob的md5(或其他)哈希,然后比较它们.初步计算会很慢,但比较快速而简单.如果您的大部分数据不经常更改,这可能是一个很好的方法.
计算md5的一种方法是通过触发器中的java语句.将它们保存在同一个表中(如果可能)或构建一个简单的辅助表.
Iglekott的想法很好,但有一点需要注意:
如果您的数据可能受到攻击,请小心使用hash-by-hash.目前在计算上不可能为特定的MD5值生成哈希冲突,但是可以生成两个不同的输入,这些输入将生成相同的MD5(因此不会触发您的代码).也可以生成具有相同前缀的两个不同的字符串,这些字符串散列到相同的值.
如果这种攻击可能导致系统的完整性受到损害,并且这是一个问题,那么您需要探索其他选项.最简单的是简单地切换哈希函数,SHA-2目前没有已知的漏洞.
如果这不是一个问题 - 地狱,请使用CRC.你不是在这里寻求加密安全性.如果这些东西安装在智能炸弹上,请不要使用加密功能弱的功能,'mkay?:-)