1. 你贴上来的触发器代码中都没有for each row,但你说是行级触发器,就算是笔误吧 *__*2. 建议为TEMP_AUDIT表建一个语句级的after insert 触发器,在此触发器中向服务器Socket发送某个消息,服务器Socket接收到该消息后,再去读取审计表。保留行级触发器,服务器Socket接收到行级触发器的消息后,缓存接收到的ID,在收到语句级触发器发送的消息后再利用这些ID读取content.

解决方案 »

  1.   

    To  Lastdrop(空杯):
      我的行级触发器是漏了for each row,谢谢!!
      我之所有为审计表建立行级触发器是因为可以得到:NEW.MID的值,而语句级触发器是不能使用:NEW.MID的啊?
      另外,请教,如果一个SQL语句更新5条记录,审计表的行级触发器是触发5次以后才执行语句触发器,还是两种触发器各执行5次??谢谢!!
      

  2.   

    Sorry,不对,因为更新5条记录可能是一条update语句所为,但是每次你都向审计表插入了一条记录(也就是执行了5条插入语句),所以审计表的语句级触发器也会被触发5次。
       
       还是改为temp表的after update语句级触发器吧。
       我知道你需要知道MID,所以"保留行级触发器,服务器Socket接收到行级触发器的消息后,缓存接收到的MID",需要你的服务器端采用缓存策略。
       或者你再写一个temp表的before update语句级触发器(好像触发器多了点 :)),在本次更新前,先产生一个随机数(保留在包中)或选取某个序列的nextval来唯一标识本次update操作,然后在temp表的行级触发器中将此随机数或某个序列的currval也插入到审计表中,在after update语句级触发器中将该值通知服务器端,这样就不会丢失MID了。
      

  3.   

    我觉得问题好像不在于触发器的多少,而是在触发器在执行的时候,只是提交了update操作而没有写入数据库,而这时外部应用程序已经来读取数据了
    我测试的情况是,当连续5次Update时,Socket收到5次消息,用数据库连接读取内容时,只有最后一次的ID对应的CONTENT有值。前面的4次都没有取到值。这是怎么回事情?
    触发器里能够判断Insert操作已经完成后再发送消息吗???
      

  4.   

    你所谓的连续5次update是执行5条update语句,还是执行一条update语句涉及到5次更新?如果是前者,确实是存在一个时间差的问题,那你可以在Socket收到消息后,延时一段时间再去读取内容。如果是后者,就按照我前面的方案应该可以解决。