在想实现如下功能,在插入一条记录前检查记录的值,不符合条件,则不让插入该记录。我使用trigger+procedure不采用抛出EXCEPTION的方式。而是捕捉异常,自行处理掉,好像无法实现,因为TRIGGER属于插入记录这个事务,用触发器没办法控制实现触发器外层的事物提交。我用触发器和存储过程测试过了,在触发器或者存储过程中使用ROLLBAKC 和COMMIT没有效果,结果是记录依然插入进去了,因为不能靠抛出异常来使记录插入失败。可有高人知道有其它在数据库中实现该功能的吗?先插入临时表再插入正式表的方式不能用在投运的系统上了。所以请不要用这种方式来解决。

解决方案 »

  1.   

    确实,按照你上面的操作,通过exception是个比较好的做法。如果你要自己控制事务的话,声明这个trigger是自治事务试试。我没有使用过,你可以试试先。在定义变量的位置加上 自治事务的声明,如下
    create or replace trigger .....
    is
    ...
    pragma autonomous_transaction;
    ...
    begin
      

  2.   


    在你的代码里,就可以自己commit和rollback了。
      

  3.   

    使用 INSTEAD OF 触发器,在此触发器中逐列判断列值是否符合要求,符合就插入,不符合就退出。
      

  4.   

    使用 INSTEAD OF 触发器,在此触发器中逐列判断列值是否符合要求,符合就插入,不符合就显示错误,并退出。
      

  5.   

    这样吧,如果一条数据不应该被插入,通过trigger的方式而又不抛异常好象是不可能的任务,那么咱们换种思路,这条数据来了之后,你在trigger中把他的值都改成一个很特殊的值(其他数据都不可以是这样的),这样,特殊的数据就被插入了,你再写一个job,定期删除这些有特殊值的记录,这样,事情就被人不知鬼不觉的做掉了。