Postgres触发不按预期工作

时间:2017-02-27 10:46:05

标签: java postgresql triggers plpgsql

Postgres 9.4触发器表现异常,

我需要有关如何确保触发器正常工作的指导原则及可能的原因

CREATE OR REPLACE FUNCTION recieptfunction()
  RETURNS trigger AS
$$
BEGIN 
IF ( NEW.dlr_mask=31 ) THEN 
INSERT INTO test1(
            rec_id, sender, receiver, udhdata, msgdata, "time", smsc_id,
            service, account, id, sms_type, mclass, mwi, coding, compress,
            validity, "deferred", dlr_mask, dlr_url, pid, alt_dcs, rpi, charset,
            boxc_id, binfo, meta_data, foreign_id, client_track_id, msg_cost,
            stid, gstid, smsid, gctid, sendreport, mno, requestresptime,
            dsm, identifier, userid, receiptcallback, replycallback, replyemail,
            delemail, sentemail, nextdayearliestsendtime, replyemailflag,
            replymsg, replytime, momt, "isUnicode",status)
    VALUES (NEW.sql_id, NEW.sender, NEW.receiver, NEW.udhdata, NEW.msgdata, NEW."time", NEW.smsc_id,
            NEW.service, NEW.account, NEW.id, NEW.sms_type, NEW.mclass, NEW.mwi, NEW.coding, NEW.compress,
            NEW.validity, NEW."deferred", NEW.dlr_mask, NEW.dlr_url, NEW.pid, NEW.alt_dcs, NEW.rpi, NEW.charset,
            NEW.boxc_id, NEW.binfo, NEW.meta_data, NEW.foreign_id, NEW.client_track_id, NEW.msg_cost,
            NEW.stid, NEW.gstid, NEW.smsid, NEW.gctid, NEW.sendreport, NEW.mno, NEW.requestresptime,
            NEW.dsm, NEW.identifier, NEW.userid, NEW.receiptcallback, NEW.replycallback, NEW.replyemail,
            NEW.delemail, NEW.sentemail, NEW.nextdayearliestsendtime, NEW.replyemailflag,
            NEW.replymsg, NEW.replytime, NEW.momt, NEW."isUnicode",NEW.dlr_mask);


ELSIF(NEW.dlr_mask=1) THEN 


        UPDATE  test1 set dlr_mask_del_success=NEW.dlr_mask, "time_del_success"=NEW."time",status=NEW.dlr_mask,showfinalstatus=true where service=NEW.service;


        ELSIF( NEW.dlr_mask=8 ) THEN 

  UPDATE  test1 set dlr_mask_smsc_sub=NEW.dlr_mask, "time_smsc_sub"=NEW."time",status=NEW.dlr_mask,showfinalstatus=false where service=NEW.service;



ELSIF( NEW.dlr_mask=16 ) THEN 

  UPDATE  test1 set dlr_mask_smsc_rej=NEW.dlr_mask, "time_smsc_rej"=NEW."time",status=NEW.dlr_mask,showfinalstatus=true where service=NEW.service;




 ELSIF( NEW.dlr_mask=4 ) THEN 

  UPDATE  test1 set dlr_mask_msg_buf=NEW.dlr_mask, "time_msg_buf"=NEW."time",status=NEW.dlr_mask,showfinalstatus=false where service=NEW.service;


ELSIF( NEW.dlr_mask=2 ) THEN  

 UPDATE  test1 set dlr_mask_del_failure=NEW.dlr_mask, "time_del_failure"=NEW."time",status=NEW.dlr_mask,showfinalstatus=true where service=NEW.service;





ELSIF( NEW.dlr_mask IS NULL ) THEN 
INSERT INTO sql_reply_reciept_sms(
            sql_id, sender, receiver, udhdata, msgdata, "time", smsc_id,
            service, account, id, sms_type, mclass, mwi, coding, compress,
            validity, "deferred", dlr_mask, dlr_url, pid, alt_dcs, rpi, charset,
            boxc_id, binfo, meta_data, foreign_id, client_track_id, msg_cost,
            stid, gstid, smsid, gctid, sendreport, mno, requestresptime,
            dsm, identifier, userid, receiptcallback, replycallback, replyemail,
            delemail, sentemail, nextdayearliestsendtime, replyemailflag,
            replymsg, replytime, momt, "isUnicode")
    VALUES (NEW.sql_id, NEW.sender, NEW.receiver, NEW.udhdata, NEW.msgdata, NEW."time", NEW.smsc_id,
            NEW.service, NEW.account, NEW.id, NEW.sms_type, NEW.mclass, NEW.mwi, NEW.coding, NEW.compress,
            NEW.validity, NEW."deferred", NEW.dlr_mask, NEW.dlr_url, NEW.pid, NEW.alt_dcs, NEW.rpi, NEW.charset,
            NEW.boxc_id, NEW.binfo, NEW.meta_data, NEW.foreign_id, NEW.client_track_id, NEW.msg_cost,
            NEW.stid, NEW.gstid, NEW.smsid, NEW.gctid, NEW.sendreport, NEW.mno, NEW.requestresptime,
            NEW.dsm, NEW.identifier, NEW.userid, NEW.receiptcallback, NEW.replycallback, NEW.replyemail,
            NEW.delemail, NEW.sentemail, NEW.nextdayearliestsendtime, NEW.replyemailflag,
            NEW.replymsg, NEW.replytime, NEW.momt, NEW."isUnicode");




ELSE  RAISE EXCEPTION 'Date out of range.  Fix the measurement_insert_trigger() function!';
END IF;    


RETURN NEW;
END;
$$
LANGUAGE plpgsql ;

这是触发器

CREATE TRIGGER afterinsert
    AFTER INSERT ON test
    FOR EACH ROW
        EXECUTE  PROCEDURE recieptfunction()

触发器表现异常,它已经输入了几乎所有数据但是在test1表中没有插入一些数据,我已经检查了它在插入过程中没有错误的日志。 9.4版本的触发器有时会出现异常,我是否需要更改版本。

0 个答案:

没有答案