锁定一条记录没有进行任何修改,再提交,就算了一次事务了现在在该条建了一个触发器,用来把对该表的修改,插入,删除等动作记下来,把复制到另一表做为日志记录。但是,像上面的情况,也记录在内了,在触发器里,通过ORACLE自带的功能,能不能把没修改任何字段就提交的这种情况实别出来呢。谢谢。

解决方案 »

  1.   

    没有进行insert, update, 和delete操作,
    根本不会触发你定义的触发器啊,也就不会复制到另一个日志记录表中。
      

  2.   

    进行UPDATE了,但是没有任何字段的修改,触发我定义的触发器了,我日志表里已经有数据了。
      

  3.   

    update没有任何字段的修改什么意思?
      

  4.   

    用:old.col 是否等于 :new.col1 来判断一下是否修改了数据,如果没有修改就不写日志表。只有进行update就是 更新的值和原来的值相等,也会触发执行。
      

  5.   

    4楼理解我意思了,
    但是用old和new判断也不行,业务要求比较麻烦,我已经改了好多次了,总是有漏的,
    这都这么写了,
    if (updating('age') and :new.age=:old.age) or (updating('COMPANY') and :new.COMPANY=:old.COMPANY)
    但是我想从根上给解决了,
    对于没有改任何字段的事务,我想区别出来,然后不像日志表中插记录。
      

  6.   

    像你说这样就不能用触发器了,触发器的机制是监控表上的操作事件,而不是操作内容. 可以写一个日志方法,方法中定义一个IsChange 变量,如果有更新的时候就是true,没有更新的基石false。最后日志方法根据变量值写日志。
      

  7.   


    应当是楼主你所说的锁定一条记录本身就执行了update操作,selet ... for update和commit语句都不会触发触发器了,你的解发器被触发肯定是执行了udpate操作,哪怕你使用原值update。这种情况下系统无法判定你是否有修改,建议楼主改变锁记录的方式。
      

  8.   

    哦,,我现在的是什么方式的锁,应该改成什么类型的呢?不要用for update是吗?系统有编辑的功能,点了编辑,然后直接保存,就插一条记录了。
      

  9.   


    你的系统在点击保存时应当是执行了update的语句,虽然更新后的内容与更新前相同,但是系统仍然会触发update触发器,这点数据库是无法分辨的。你应当做的是在前台判断,如果没有更改的内容,点击保存时应当不执行update语句。