小弟遇到一個奇怪的問題,oracle資料庫觸發器用于監視資料庫的插入更新和洗掉,并聲稱日志。出現了一個奇怪的現象,如下例如A表設定了itemcode和orgcode唯一索引。但是監視該表的觸發器,日志發現了連續的插入兩條相同itemcode和orgcode的記錄。附上圖

。以上是日志表記錄,updateno是增長主鍵,opertime是操作時間。
請問出現這種情況是什么導致的呢?
uj5u.com熱心網友回復:
貼一下建表陳述句、觸發器陳述句、插入陳述句, 這三個文本。uj5u.com熱心網友回復:
主表: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;
uj5u.com熱心網友回復:
補充一下,這個問題,并不是一定會出現。而是偶爾出現的,因為我們是用了多個應用連接資料庫進行操作。會不會是并發出現的問題呢?uj5u.com熱心網友回復:
看了你的陳述句,沒有造成這個資料重復的可能。樓主,你可以這樣閃回查詢一下表,看看第二條記錄產生的時候,資料表的中內容是什么。
uj5u.com熱心網友回復:
感覺,是有其他的什么會話,修改了這條記錄(但是沒有記錄),有些怪。uj5u.com熱心網友回復:
這個問題出現概率比較低,因為是線上系統。比較難重現,所以閃回很難找原因呀。
uj5u.com熱心網友回復:
從資料上來看,兩次插入相差時間蠻大的,而且資料不一樣,具體表里面的資料是前一次插入還是后一次插入的呢?會不會是有的地方插入的時候,updateno對應的sequence沒有取nextval?轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/49721.html
標籤:高級技術
上一篇:遞回查詢寫法求助
