ORACLE触发器问题

deeevilyu 2019-03-21 12:03:05
小弟遇到一个奇怪的问题,oracle数据库触发器用于监视数据库的插入更新和删除,并声称日志。出现了一个奇怪的现象,如下例如A表设置了itemcode和orgcode唯一索引。但是监视该表的触发器,日志发现了连续的插入两条相同itemcode和orgcode的记录。附上图

。以上是日志表记录,updateno是增长主键,opertime是操作时间。
请问出现这种情况是什么导致的呢?
...全文
252 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nailgo 2019-03-29
  • 打赏
  • 举报
回复
从数据上来看,两次插入相差时间蛮大的,而且数据不一样,具体表里面的数据是前一次插入还是后一次插入的呢?会不会是有的地方插入的时候,updateno对应的sequence没有取nextval?
deeevilyu 2019-03-26
  • 打赏
  • 举报
回复
引用 4 楼 卖水果的net 的回复:
看了你的语句,没有造成这个数据重复的可能。 楼主,你可以这样闪回查询一下表,看看第二条记录产生的时候,数据表的中内容是什么。
这个问题出现概率比较低,因为是线上系统。比较难重现,所以闪回很难找原因呀。
卖水果的net 2019-03-21
  • 打赏
  • 举报
回复
贴一下建表语句、触发器语句、插入语句, 这三个文本。
卖水果的net 2019-03-21
  • 打赏
  • 举报
回复
感觉,是有其他的什么会话,修改了这条记录(但是没有记录),有些怪。
卖水果的net 2019-03-21
  • 打赏
  • 举报
回复
看了你的语句,没有造成这个数据重复的可能。 楼主,你可以这样闪回查询一下表,看看第二条记录产生的时候,数据表的中内容是什么。
deeevilyu 2019-03-21
  • 打赏
  • 举报
回复
补充一下,这个问题,并不是一定会出现。而是偶尔出现的,因为我们是用了多个应用连接数据库进行操作。会不会是并发出现的问题呢?
deeevilyu 2019-03-21
  • 打赏
  • 举报
回复
主表: create table FIN_UNDRUGINFO ( itemid VARCHAR2(36) not null, orgcode VARCHAR2(20) not null, itemcode VARCHAR2(15) not null, itemname VARCHAR2(200) not null, specs VARCHAR2(50), spellcode VARCHAR2(100), wbcode VARCHAR2(100), unitprice NUMBER(10,2), stockunit VARCHAR2(20), feecode VARCHAR2(4) not null, outinvocode VARCHAR2(3), ininvocode VARCHAR2(3), nhcentercode VARCHAR2(20), itemstatus VARCHAR2(1) not null, exedeptcode VARCHAR2(20), exedeptname VARCHAR2(30), opercode VARCHAR2(6), opername VARCHAR2(30), opertime DATE ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64M next 1M minextents 1 maxextents unlimited ); -- Add comments to the table comment on table FIN_UNDRUGINFO is 'Fin_收费项目表'; -- Add comments to the columns comment on column FIN_UNDRUGINFO.itemid is '诊疗项目ID'; comment on column FIN_UNDRUGINFO.orgcode is '医疗机构编码'; comment on column FIN_UNDRUGINFO.itemcode is '项目编码'; comment on column FIN_UNDRUGINFO.itemname is '项目名称'; comment on column FIN_UNDRUGINFO.specs is '规格'; comment on column FIN_UNDRUGINFO.spellcode is '拼音简码'; comment on column FIN_UNDRUGINFO.wbcode is '五笔简码'; comment on column FIN_UNDRUGINFO.unitprice is '项目单价'; comment on column FIN_UNDRUGINFO.stockunit is '单位'; comment on column FIN_UNDRUGINFO.feecode is '最小核算科目编码,编码不能修改'; comment on column FIN_UNDRUGINFO.outinvocode is '门诊发票科目'; comment on column FIN_UNDRUGINFO.ininvocode is '住院发票科目'; comment on column FIN_UNDRUGINFO.nhcentercode is '农合中心项目编码'; comment on column FIN_UNDRUGINFO.itemstatus is '项目状态: 1在用 0停用'; comment on column FIN_UNDRUGINFO.exedeptcode is '执行科室-主要指医技科室'; comment on column FIN_UNDRUGINFO.exedeptname is '执行科室名称'; comment on column FIN_UNDRUGINFO.opercode is '操作员工号'; comment on column FIN_UNDRUGINFO.opername is '操作员姓名'; comment on column FIN_UNDRUGINFO.opertime is '操作时间'; -- Create/Recreate indexes create unique index IDX_FIN_UNDRUGINFO_1 on FIN_UNDRUGINFO (ITEMCODE, ORGCODE) tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 34M next 1M minextents 1 maxextents unlimited ); create index IDX_FIN_UNDRUGINFO_2 on FIN_UNDRUGINFO (ORGCODE, FEECODE) tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 29M next 1M minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table FIN_UNDRUGINFO add constraint PK_FIN_UNDRUGINFO primary key (ITEMID) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 21M next 1M minextents 1 maxextents unlimited ); alter table FIN_UNDRUGINFO add constraint PK_ORGCODE_ITEM_CODE unique (ORGCODE, ITEMCODE); 触发器: CREATE OR REPLACE TRIGGER trg_undruginfo AFTER DELETE OR INSERT OR UPDATE ON fin_undruginfo FOR EACH ROW DECLARE v_lognum VARCHAR2(3); var_orgcoce VARCHAR2(20); BEGIN IF deleting THEN --获取当前定点对应的LOG表编号 SELECT license INTO v_lognum FROM up_org_unit_ext WHERE orgcode = :old.orgcode; --删除操作增加删除SQL INSERT INTO localdbupdatelog (updateno, orgcode, tablename, updatesql, sqlparameter, opertime, opertype, entityid) VALUES (seq_localdb_update_no.nextval, '' || :old.orgcode || '', 'FIN_UNDRUGINFO', 'DELETE FROM FIN_UNDRUGINFO WHERE ITEMID=?', '[''' || :old.itemid || ''']', SYSDATE, 'DELETE', '' || :old.itemid || ''); ELSIF inserting THEN var_orgcoce := :new.Orgcode; --获取当前定点对应的LOG表编号 SELECT license INTO v_lognum FROM up_org_unit_ext WHERE orgcode = var_orgcoce; INSERT INTO localdbupdatelog (updateno, orgcode, tablename, updatesql, sqlparameter, opertime, opertype, entityid) VALUES (seq_localdb_update_no.nextval, '' || :new.orgcode || '', 'FIN_UNDRUGINFO', 'INSERT INTO FIN_UNDRUGINFO(ITEMID,ORGCODE,ITEMCODE,ITEMNAME,SPECS,SPELLCODE,WBCODE,UNITPRICE,STOCKUNIT,FEECODE,OUTINVOCODE,' || 'ININVOCODE,NHCENTERCODE,ITEMSTATUS,EXEDEPTCODE,EXEDEPTNAME,OPERCODE,OPERNAME,OPERTIME)' || ' VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', '[''' || :new.itemid || ''',''' || :new.orgcode || ''',''' || :new.itemcode || ''',''' || REPLACE(:new.itemname, '''', '') || ''',''' || REPLACE(:new.specs, '''', '') || ''',''' || REPLACE(:new.spellcode, '''', '') || ''',''' || REPLACE(:new.wbcode, '''', '') || ''',''' || :new.unitprice || ''',''' || :new.stockunit || ''',''' || :new.feecode || ''',''' || :new.outinvocode || ''',''' || :new.ininvocode || ''',''' || :new.nhcentercode || ''',''' || :new.itemstatus || ''',''' || :new.exedeptcode || ''',''' || REPLACE(:new.exedeptname, '''', '') || ''',''' || :new.opercode || ''',''' || :new.opername || ''',''' || :new.opertime || ''']', SYSDATE, 'INSERT', '' || :new.itemid || ''); ELSIF updating THEN --当前值 var_orgcoce := :old.orgcode; --获取当前定点对应的LOG表编号 SELECT license INTO v_lognum FROM up_org_unit_ext WHERE orgcode = :old.orgcode; --对于UPDATE先删除该变动对象所有的UPDATE记录,然后重新生成最新UPDATE记录 DELETE FROM localdbupdatelog WHERE entityid = :old.itemid AND opertype = 'UPDATE' AND tablename = 'FIN_UNDRUGINFO'; INSERT INTO localdbupdatelog (updateno, orgcode, tablename, updatesql, sqlparameter, opertime, opertype, entityid) VALUES (seq_localdb_update_no.nextval, '' || :new.orgcode || '', 'FIN_UNDRUGINFO', 'UPDATE FIN_UNDRUGINFO ' || 'SET ORGCODE=?,ITEMCODE=?,ITEMNAME=?,SPECS=?,SPELLCODE=?,WBCODE=?,' || 'UNITPRICE=?,STOCKUNIT=?,FEECODE=?,OUTINVOCODE=?,ININVOCODE=?,NHCENTERCODE=?,' || 'ITEMSTATUS=?,EXEDEPTCODE=?,EXEDEPTNAME=?,OPERCODE=?,OPERNAME=?,OPERTIME=? WHERE ITEMID=?', '[''' || :new.orgcode || ''',''' || :new.itemcode || ''',''' || REPLACE(:new.itemname, '''', '') || ''',''' || REPLACE(:new.specs, '''', '') || ''',''' || :new.spellcode || ''',''' || :new.wbcode || ''',''' || :new.unitprice || ''',''' || :new.stockunit || ''',''' || :new.feecode || ''',''' || :new.outinvocode || ''',''' || :new.ininvocode || ''',''' || :new.nhcentercode || ''',''' || :new.itemstatus || ''',''' || :new.exedeptcode || ''',''' || REPLACE(:new.exedeptname, '''', '') || ''',''' || :new.opercode || ''',''' || :new.opername || ''',''' || :new.opertime || ''',''' || :new.itemid || ''']', SYSDATE, 'UPDATE', '' || :old.itemid || ''); END IF; END trg_undruginfo;

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧