亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

詳解oracle中通過觸發器記錄每個語句影響總行數

2024-08-29 14:00:18
字體:
來源:轉載
供稿:網友

詳解oracle中通過觸發器記錄每個語句影響總行數

需求產生:

       業務系統中,有一步“抽數”流程,就是把一些數據從其它服務器同步到本庫的目標表。這個過程有可能 多人同時抽數,互相影響。有測試人員反應,原來抽過的數,偶爾就無緣無故的找不到了,有時又會出來重復行。這個問題產生肯定是抽數邏輯問題以及并行的問題了!但他們提了一個簡單的需求:想知道什么時候數據被刪除了,什么時候插入了,我需要監控“表的每一次變更”!

技術選擇:

     第一就想到觸發器,這樣能在不涉及業務系統的代碼情況下,實現監控。觸發器分為“語句級觸發器”和“行級觸發器”。語句級是每一個語句執行前后觸發一次操作,如果我在每一個SQL語句執行后,把表名,時間,影響行寫到記錄表里就行了。

     但問題來了,在語句觸發器中,無法得到該語句的行數,sql%rowcount  在觸發器里報錯。只能用行級觸發器去統計行數!

代碼結構:

整個監控數據行的功能包含: 一個日志表,包,序列。

日志表:記錄目標表名,SQL執行開始、結束時間,影響行數,監控數據行上的某些列信息。

包:主要是3個存儲過程,

  • 語句開始存儲過程:用關聯數組來記錄目標表名和開始時間,把其它值清0.
  • 行操作存儲過程:把關聯數組目標表所對應的記錄數加1。
  • 語句結束存儲過程:把關聯數組目標表中統計的信息寫到日志表。

序列: 用于生成日志表的主鍵

代碼:

日志表和序列:

create table T_CSLOG( n_id   NUMBER not null, tblname VARCHAR2(30) not null, sj1   DATE, sj2   DATE, i_hs   NUMBER, u_hs   NUMBER, d_hs   NUMBER, portcode CLOB, startrq DATE, endrq  DATE, bz    VARCHAR2(100), n    NUMBER)create index IDX_T_CSLOG1 on T_CSLOG (TBLNAME, SJ1, SJ2)alter table T_CSLOG add constraint PRIKEY_T_CSLOG primary key (N_ID)  create sequence SEQ_T_CSLOGminvalue 1maxvalue 99999999999start with 1increment by 1cache 20cycle;

oracle,觸發器,記錄,語句,總行數,oracle中觸發器記錄

包代碼:

-包頭create or replace package pck_cslog is --聲明一個關聯數組類型,它就是日志表的關聯數組 type cslog_type is table of t_cslog%rowtype index by t_cslog.tblname%type; --聲明這個關聯數組的變量。 cslog_tbl cslog_type; --語句開始。  procedure onbegin_cs(v_tblname t_cslog.tblname%type, v_type varchar2); --行操作 procedure oneachrow_cs(v_tblname t_cslog.tblname%type,             v_type  varchar2,             v_code  varchar2 := '',             v_rq   date := ''); --語句結束,寫到日志表中。 procedure onend_cs(v_tblname t_cslog.tblname%type, v_type varchar2);end pck_cslog;--包體create or replace package body pck_cslog is --私有方法,把關聯數組中的一條記錄寫入庫里 procedure write_cslog(v_tblname t_cslog.tblname%type) is begin  if cslog_tbl.exists(v_tblname) then   insert into t_cslog values cslog_tbl (v_tblname);  end if; end; --私有方法,清除關聯數組中的一條記錄 procedure clear_cslog(v_tblname t_cslog.tblname%type) is begin  if cslog_tbl.exists(v_tblname) then   cslog_tbl.delete(v_tblname);  end if; end; --某個SQL語句執行開始。 v_type:語句類型,insert時為 i, update時為u ,delete時為 d procedure onbegin_cs(v_tblname t_cslog.tblname%type, v_type varchar2) is begin   --如果關聯數組中不存在,初始賦值。 否則表示,同時有insert,delete語句對目標表操作。  if not cslog_tbl.exists(v_tblname) then   cslog_tbl(v_tblname).n_id := seq_t_cslog.nextval;   cslog_tbl(v_tblname).tblname := v_tblname;   cslog_tbl(v_tblname).sj1 := sysdate;   cslog_tbl(v_tblname).sj2 := null;   cslog_tbl(v_tblname).i_hs := 0;   cslog_tbl(v_tblname).u_hs := 0;   cslog_tbl(v_tblname).d_hs := 0;   cslog_tbl(v_tblname).portcode := ' '; --初始給一個空格   cslog_tbl(v_tblname).startrq := to_date('9999', 'yyyy');   cslog_tbl(v_tblname).endrq := to_date('1900', 'yyyy');   cslog_tbl(v_tblname).n := 0;  end if;  cslog_tbl(v_tblname).bz := cslog_tbl(v_tblname).bz || v_type || ',';  ----第一個語句進入,顯示1,如果以后并行,則該值遞增。  cslog_tbl(v_tblname).n := cslog_tbl(v_tblname).n + 1;  end; --每行操作。 procedure oneachrow_cs(v_tblname t_cslog.tblname%type,             v_type  varchar2,             v_code  varchar2 := '',             v_rq   date := '') is begin  if cslog_tbl.exists(v_tblname) then   --行數,代碼,起、止時間   if v_type = 'i' then    cslog_tbl(v_tblname).i_hs := cslog_tbl(v_tblname).i_hs + 1;   elsif v_type = 'u' then    cslog_tbl(v_tblname).u_hs := cslog_tbl(v_tblname).u_hs + 1;   elsif v_type = 'd' then    cslog_tbl(v_tblname).d_hs := cslog_tbl(v_tblname).d_hs + 1;   end if;      if v_code is not null and     instr(cslog_tbl(v_tblname).portcode, v_code) = 0 then    cslog_tbl(v_tblname).portcode := cslog_tbl(v_tblname).portcode || ',' || v_code;   end if;     if v_rq is not null then    if v_rq > cslog_tbl(v_tblname).endrq then     cslog_tbl(v_tblname).endrq := v_rq;    end if;    if v_rq < cslog_tbl(v_tblname).startrq then     cslog_tbl(v_tblname).startrq := v_rq;    end if;   end if;  end if; end; --語句結束。  procedure onend_cs(v_tblname t_cslog.tblname%type, v_type varchar2) is begin  if cslog_tbl.exists(v_tblname) then   cslog_tbl(v_tblname).bz := cslog_tbl(v_tblname)                 .bz || '-' || v_type || ',';   --語句退出,將并行標志位減一。 當它為0時,就可以寫表了   cslog_tbl(v_tblname).n := cslog_tbl(v_tblname).n - 1;   if cslog_tbl(v_tblname).n = 0 then    cslog_tbl(v_tblname).sj2 := sysdate;    write_cslog(v_tblname);    clear_cslog(v_tblname);   end if;  end if; end;begin null;end pck_cslog;

綁定觸發器:

有了以上代碼后,想要監控的一個目標表,只需要給它添加三個觸發器,調用包里對應的存儲過程即可。  假定我要監控  T_A 的表:

     oracle,觸發器,記錄,語句,總行數,oracle中觸發器記錄

三個觸發器:

--語句開始前create or replace trigger tri_onb_t_a before insert or delete or update on t_adeclare v_type varchar2(1);begin if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if; pck_cslog.onbegin_cs('t_a', v_type);end;--語句結束后create or replace trigger tri_one_t_a after insert or delete or update on t_adeclare v_type varchar2(1);begin if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if; pck_cslog.onend_cs('t_a', v_type);end;--行級觸發器create or replace trigger tri_onr_t_a after insert or delete or update on t_a for each rowdeclare v_type varchar2(1);begin if inserting then  v_type := 'i'; elsif updating then  v_type := 'u'; elsif deleting then  v_type := 'd'; end if; if v_type = 'i' or v_type = 'u' then  pck_cslog.oneachrow_cs('t_a', v_type, :new.name); --此處是把監控的行的某一列的值傳入包體,這樣最后會記錄到日志表 elsif v_type = 'd' then  pck_cslog.oneachrow_cs('t_a', v_type, :old.name); end if;end;

測試成果:

觸發器建好了,可以測試插入刪除了。先插入100行,再隨便刪除一些行。

declare i number;begin for i in 1 .. 100 loop  insert into t_a values (i, i || 'shenjunjian'); end loop; commit;  delete from t_a  where id > 79; delete from t_a  where id < 40; commit;end;

oracle,觸發器,記錄,語句,總行數,oracle中觸發器記錄

clob列,還可以顯示監控刪除的行:

oracle,觸發器,記錄,語句,總行數,oracle中觸發器記錄

并行時,在bz列中,可能會有類似信息:

i,i,-i,-i  ,這表示同一時間有2個語句在插入目標表。

i,d,-d,-i  表示在插入時,有一個刪除語句也在執行。

當平臺多人在用時,避免不了有同時操作同一張表的情況,通過這個列的值,可以觀察到數據庫的執行情況!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
视频一区视频二区国产精品| 成人欧美一区二区三区在线湿哒哒| 欧美激情精品久久久久久免费印度| 欧美黑人国产人伦爽爽爽| 精品亚洲一区二区三区在线播放| 中文字幕亚洲图片| 57pao成人国产永久免费| 亚洲视频自拍偷拍| 亚洲丁香久久久| 欧美激情视频免费观看| 欧美精品在线观看91| 97成人精品视频在线观看| 国产精品视频色| 亚洲视频777| 日本精品久久久久影院| 中文字幕亚洲天堂| 欧美多人乱p欧美4p久久| 国产精品久久久久久久久影视| 91久热免费在线视频| 欧美xxxwww| 国产精品一区二区三区免费视频| 色琪琪综合男人的天堂aⅴ视频| 久久久999国产精品| 亚洲大胆人体视频| 亚洲欧美另类自拍| 日韩欧美精品在线观看| 亚洲国产精品久久91精品| 国产福利成人在线| 狠狠色狠狠色综合日日小说| 97香蕉久久夜色精品国产| 国产精品日日做人人爱| 热久久美女精品天天吊色| 欧美成人午夜影院| 亚洲九九九在线观看| 欧美成人在线网站| 91高清免费在线观看| 亚洲人a成www在线影院| 91精品国产免费久久久久久| 色妞一区二区三区| 欧美成人精品xxx| www.日韩不卡电影av| 国产在线精品自拍| 亚洲成人久久一区| 日韩在线免费视频| 亚洲国产精品悠悠久久琪琪| 亚洲激情第一页| 欧美午夜性色大片在线观看| 国产69久久精品成人| 亚洲最大的免费| 亚洲第一精品电影| 亚洲欧洲国产一区| 国产精品视频xxx| 国产精品精品一区二区三区午夜版| 久久亚洲精品毛片| 亚洲第一国产精品| 国产精品专区第二| 欧美限制级电影在线观看| 欧美色播在线播放| 欧美日韩成人在线播放| 91在线观看免费高清| 日韩精品极品毛片系列视频| 国产精品影院在线观看| 国产精品第七十二页| 欧美激情精品久久久久久黑人| 欧美黄色小视频| 亚洲福利视频网| xxxxxxxxx欧美| 亚洲精品综合精品自拍| 狠狠久久五月精品中文字幕| 国产精品久久国产精品99gif| 91精品国产高清自在线看超| 日韩天堂在线视频| 成人av在线网址| 在线精品视频视频中文字幕| 亚洲国产精品专区久久| 亚洲色图欧美制服丝袜另类第一页| 午夜精品三级视频福利| 成人黄色免费在线观看| 97国产精品视频人人做人人爱| 亚洲人午夜精品| 国色天香2019中文字幕在线观看| 国产精品高潮呻吟久久av无限| 日韩欧美成人区| 69av成年福利视频| 亚洲国产私拍精品国模在线观看| 福利微拍一区二区| 日韩福利伦理影院免费| 日本午夜精品理论片a级appf发布| 欧美一级淫片aaaaaaa视频| 欧美成人精品在线视频| 欧美精品videosex性欧美| 欧美猛交ⅹxxx乱大交视频| 亚洲爱爱爱爱爱| 久久综合色88| 亚洲成成品网站| 欧美丰满少妇xxxxx做受| 亚洲成年人影院在线| 国产日韩av高清| 91久久精品国产91久久| 精品国产乱码久久久久久天美| 亚洲精品二三区| 欧美专区国产专区| 日韩电影中文字幕在线| 成人妇女免费播放久久久| 影音先锋日韩有码| 黑人巨大精品欧美一区二区一视频| 在线观看国产成人av片| 欧美成年人视频网站欧美| 国产美女久久精品| 日韩av片电影专区| 91久久久久久久久| 欧美精品在线视频观看| 国产区亚洲区欧美区| 国产视频丨精品|在线观看| 中文欧美在线视频| 久久精品久久久久久国产 免费| 亚洲欧美日韩国产成人| 欧美黑人极品猛少妇色xxxxx| 亚洲第一精品久久忘忧草社区| 久久九九国产精品怡红院| 亚洲第一天堂无码专区| 欧美性生活大片免费观看网址| 国产精品久久久久福利| 日韩中文字幕免费| 亚洲a一级视频| 欧美日韩国产一区二区三区| 国产一区视频在线播放| 97在线免费视频| 欧美激情久久久久| 日本高清视频精品| 亚洲综合日韩在线| 日韩电影中文 亚洲精品乱码| 少妇高潮 亚洲精品| 亚洲第一视频网站| 日韩电影在线观看永久视频免费网站| 亚洲精品欧美一区二区三区| 91精品国产91久久久久福利| 九九久久国产精品| 亚洲激情视频在线观看| 日韩高清av在线| 麻豆乱码国产一区二区三区| 亚洲女在线观看| 久久在线免费观看视频| 精品亚洲一区二区三区| 日韩高清不卡av| 欧美富婆性猛交| 亚洲欧美日韩在线高清直播| 日韩经典第一页| 欧美插天视频在线播放| 欧美亚洲另类视频| 久久久久久久久91| 亚洲精品wwww| 在线精品国产欧美| 国产精品高精视频免费| 亚洲成人网在线观看| 久久精品国产一区二区三区| 欧美国产日韩二区| 热久久免费视频精品| 亚洲专区国产精品| 最近2019年好看中文字幕视频| 久久亚洲精品成人| 亚洲天堂开心观看| 久久99青青精品免费观看| 在线观看日韩av|