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

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

詳解oracle中通過觸發(fā)器記錄每個語句影響總行數(shù)

2024-08-29 14:00:18
字體:
供稿:網(wǎng)友

詳解oracle中通過觸發(fā)器記錄每個語句影響總行數(shù)

需求產(chǎn)生:

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

技術(shù)選擇:

     第一就想到觸發(fā)器,這樣能在不涉及業(yè)務(wù)系統(tǒng)的代碼情況下,實現(xiàn)監(jiān)控。觸發(fā)器分為“語句級觸發(fā)器”和“行級觸發(fā)器”。語句級是每一個語句執(zhí)行前后觸發(fā)一次操作,如果我在每一個SQL語句執(zhí)行后,把表名,時間,影響行寫到記錄表里就行了。

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

代碼結(jié)構(gòu):

整個監(jiān)控數(shù)據(jù)行的功能包含: 一個日志表,包,序列。

日志表:記錄目標表名,SQL執(zhí)行開始、結(jié)束時間,影響行數(shù),監(jiān)控數(shù)據(jù)行上的某些列信息。

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

  • 語句開始存儲過程:用關(guān)聯(lián)數(shù)組來記錄目標表名和開始時間,把其它值清0.
  • 行操作存儲過程:把關(guān)聯(lián)數(shù)組目標表所對應(yīng)的記錄數(shù)加1。
  • 語句結(jié)束存儲過程:把關(guān)聯(lián)數(shù)組目標表中統(tǒng)計的信息寫到日志表。

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

代碼:

日志表和序列:

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,觸發(fā)器,記錄,語句,總行數(shù),oracle中觸發(fā)器記錄

包代碼:

-包頭create or replace package pck_cslog is --聲明一個關(guān)聯(lián)數(shù)組類型,它就是日志表的關(guān)聯(lián)數(shù)組 type cslog_type is table of t_cslog%rowtype index by t_cslog.tblname%type; --聲明這個關(guān)聯(lián)數(shù)組的變量。 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 := ''); --語句結(jié)束,寫到日志表中。 procedure onend_cs(v_tblname t_cslog.tblname%type, v_type varchar2);end pck_cslog;--包體create or replace package body pck_cslog is --私有方法,把關(guān)聯(lián)數(shù)組中的一條記錄寫入庫里 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; --私有方法,清除關(guān)聯(lián)數(shù)組中的一條記錄 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語句執(zhí)行開始。 v_type:語句類型,insert時為 i, update時為u ,delete時為 d procedure onbegin_cs(v_tblname t_cslog.tblname%type, v_type varchar2) is begin   --如果關(guān)聯(lián)數(shù)組中不存在,初始賦值。 否則表示,同時有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   --行數(shù),代碼,起、止時間   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; --語句結(jié)束。  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;

綁定觸發(fā)器:

有了以上代碼后,想要監(jiān)控的一個目標表,只需要給它添加三個觸發(fā)器,調(diào)用包里對應(yīng)的存儲過程即可。  假定我要監(jiān)控  T_A 的表:

     oracle,觸發(fā)器,記錄,語句,總行數(shù),oracle中觸發(fā)器記錄

三個觸發(fā)器:

--語句開始前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;--語句結(jié)束后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;--行級觸發(fā)器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); --此處是把監(jiān)控的行的某一列的值傳入包體,這樣最后會記錄到日志表 elsif v_type = 'd' then  pck_cslog.oneachrow_cs('t_a', v_type, :old.name); end if;end;

測試成果:

觸發(fā)器建好了,可以測試插入刪除了。先插入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,觸發(fā)器,記錄,語句,總行數(shù),oracle中觸發(fā)器記錄

clob列,還可以顯示監(jiān)控刪除的行:

oracle,觸發(fā)器,記錄,語句,總行數(shù),oracle中觸發(fā)器記錄

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

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

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

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

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

注:相關(guān)教程知識閱讀請移步到oracle教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲精品白浆高清久久久久久| 色婷婷在线视频| 亚洲精选一区二区| 亚洲精品人成电影网| 97超级碰在线看视频免费在线看| 日韩av大片| 97视频中文字幕| 国产成人精品久久| 九七影院97影院理论片免费| 国产一级中文字幕| 亚洲国产成人va在线观看天堂| 亚洲一区二区三区小说| 九九这里只有精品视频| 激情文学综合丁香| 久久观看最新视频| 日本va欧美va精品发布| 欧美性开放视频| 欧美精品激情视频| 日韩一区二区三区免费看| 国产亚洲综合久久| 亚洲国产成人高清精品| 女教师高潮黄又色视频| 在线人成日本视频| 三区在线视频| 中文日韩在线视频| 日韩网红少妇无码视频香港| 色一情一乱一乱一91av| 91wwwcom在线观看| 国产一区二区三区高清视频| 免费观看的成年网址| 欧美一级高清片在线观看| 国产精品日日摸夜夜添夜夜av| 奇米影视在线99精品| 亚洲日本在线观看视频| 亚洲精品2区| 国产成人福利短视频app| 91超碰在线电影| 成人性视频欧美一区二区三区| 国内成人自拍视频| 亚洲日本中文字幕区| 亚洲人成人无码网www国产| 亚洲综合自拍网| 亚洲欧美精品日韩欧美| 亚洲成人av资源网| 伊人蜜桃色噜噜激情综合| 久久久天堂av| 精品视频一区二区不卡| 性一爱一乱一交一视频| 日韩成人精品一区二区三区| 黑人巨大精品欧美一区二区一视频| 免费超爽大片黄| 男人操女人动态图| 日本综合精品一区| 欧美精品在线极品| 成人精品福利视频| av电影天堂一区二区在线| 中文字幕中文字幕中文字幕亚洲无线| 国产香蕉一区二区三区| 亚洲成人一二三区| 久久久综合网| 无码人妻一区二区三区在线| 欧美日韩亚洲成人| 老司机精品导航| 在线免费观看一区二区| 在线a欧美视频| 少妇av片在线观看| 91浏览器在线视频| 一级黄色免费毛片| 丝袜亚洲另类欧美综合| 伊人久久噜噜噜躁狠狠躁| 在线观看日韩一区二区| 精品国产91乱码一区二区三区| 国产精品久久久久久久久久久久久久久久久久| 一区二区视频在线免费观看| 日韩写真欧美这视频| 精品裸体舞一区二区三区| 精品国产中文字幕| 国产精品高精视频免费| 日韩av一区二区三区在线| 国产精品初高中害羞小美女文| 韩日在线视频| 欧美激情视频网站| 日本二区视频| 人人爽香蕉精品| 一个色在线视频| 最近2018中文字幕免费在线视频| 三级视频在线播放| 午夜无码国产理论在线| 日本黄色免费在线观看| 日韩不卡免费视频| 韩国19禁主播vip福利视频| 久久久久国产精品夜夜夜夜夜| 黄漫在线观看| 日本h视频在线观看| 91n.com在线观看| 九色精品高清在线播放| 先锋影音av资源站| 国产精品露脸自拍| 色大师av一区二区三区| 青青草视频一区| 国产香蕉视频在线观看| 日本成人网址| 国产69精品久久| 国产传媒在线观看| 欧美一区日韩一区| 欧美成人三级在线播放| 久久精品黄色片| 国产美女极度色诱视频www| 精品一区二区三区欧美| 国产小视频你懂的| 黄色片免费在线观看| 成人免费在线观看视频网站| 国模少妇一区二区三区| 深夜成人影院| 精品国产一区二区三区久久久樱花| 久久久久久久少妇| 成人18在线| 国产麻豆日韩| 九九久久精品视频| 免费av在线一区二区| 久久99久久99精品| 在线成人国产| 亚洲无限乱码一二三四麻| 国内精品麻豆| 午夜视频在线免费看| 91短视频在线| 免费成人深夜夜行网站视频| 欧美影院一区| 无遮挡动作视频在线观看免费入口| 无码人妻丰满熟妇区毛片蜜桃精品| 欧美优质美女网站| 亚洲精品视频专区| 成人国产在线| 一区二区在线观看视频在线| 一级黄色大片视频| 欧美日韩在线视频免费播放| 人与人69性欧美三人交| 欧美久久一区二区| 亚洲成av人片在线观看无码| 精品1区2区3区4区| 男人c女人视频| 成人午夜私人影院| 国产精品日韩一区| 又嫩又硬又黄又爽的视频| 欧美日韩国产中字| 欧美日本中文| 欧美性猛片aaaaaaa做受| 国产成人调教视频在线观看| 精品国产伦理网| 在线视频超级| 国产在线激情视频| 亚洲三区欧美一区国产二区| 精品人妻二区中文字幕| 2023国产精品视频| 先锋av在线资源| 国产一区二区三区四| 久久艹免费视频| 蜜桃传媒一区二区三区| 台湾无码一区二区| 欧美精品一区二区三区免费| 亚洲天堂日韩在线| 伊人再见免费在线观看高清版| 国产99久久久国产精品免费看| 久久国产日本精品| 日本91福利区| 久久精品免费av| 亚洲美女喷白浆| 日本美女视频一区二区| 丰满人妻中伦妇伦精品app| 日本一区二区在线视频观看| 欧产日产国产精品98| 欧美啪啪网站| 国内欧美日韩| 国产天堂第一区| 最近2019中文字幕大全第二页| 国产成人精品久久久| 在线看片欧美| 高清在线一区二区| 免费精品视频一区二区三区| 亚洲最大成人在线| xfplay精品久久| 国产一区免费电影| 老司机aⅴ在线精品导航| 校园春色 亚洲| 欧美激情资源网| 亚洲欧美日韩成人网| 成人aaaa| 日韩av在线天堂| 99re在线视频观看| 日韩精品高清在线观看| 国产日产精品一区二区三区四区| 免费一级毛片在线观看| 亚洲a中文字幕| 亚洲欧洲中文日韩久久av乱码| 久久国产一区二区| 青草在线视频在线观看| 四虎a级欧美在线观看| 伪装者免费全集在线观看| av电影在线网站| 又黄又湿又爽又免费又色| 亚洲九九精品| 亚洲每日在线| www.成人| 欧美性视频在线播放| 国产精品第一第二| 开心丁香婷婷深爱五月| 国产美女视频网站| 神马午夜dy888| 国产二级片在线观看| 久久精品国产欧美亚洲人人爽| 公侵犯人妻一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 国产在线黄色片| 中文字幕a级片| 国产日产欧美一区二区视频| 羞羞答答成人影院www| 性爱视频日本| 亚洲欧美乱综合图片区小说区| 色噜噜狠狠一区二区三区果冻| caopor在线视频| 日韩国产精品一区二区| 久久电影中文字幕| 久久综合伊人77777尤物| 九九热在线视频观看这里只有精品| 欧美激情资源网| 手机在线免费观看毛片| 日韩成人精品一区二区| www在线观看黄色| 亚洲精品一级片| 国产精品一区专区欧美日韩| 成人影院午夜久久影院| 国产电影一区二区三区| 4kfree性满足欧美hd18| 日本免费中文字幕在线| 中文字幕日韩一区二区不卡| 亚洲精品7777| 国产最新精品| 国产麻豆入在线观看| 国产成人亚洲综合a∨婷婷图片| 中文字幕在线2018| 91丨porny丨国产入口| 99国产精品久久久久久久成人热| 在线观看国产精品视频| 五月网丁香网| 亚洲欧美综合久久久| 日韩福利在线播放| 亚洲一区中文字幕| 国产xxx免费观看| 亚洲欧洲一区二区| 日韩成人av网| 翔田千里亚洲一二三区| 亚洲图色中文字幕| 亚洲一区二区久久| 国产一二三在线观看| 一区二区日韩欧美| 国产在线视频2019最新视频| 亚洲欧美韩国| 日韩中文第一页| 秋霞成人午夜鲁丝一区二区三区| 午夜精品一区二区三区电影天堂| 亚州国产精品| 午夜精品久久久久久久久久久久| 精品亚洲aⅴ无码一区二区三区| 欧美日韩亚洲一区| 欧美一区二区三区四区夜夜大片| 一级黄色香蕉视频| 午夜伦理福利在线| 韩国无码一区二区三区精品| 30一40一50老女人毛片| 色偷偷色偷偷色偷偷在线视频| 97视频网站| 婷婷国产成人精品视频| 1069视频| 一区二区三区视频在线播放| 色视频成人在线观看免| 久久久久久久久一区| 中文字幕乱码人妻综合二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 欧美不卡一区二区三区四区| 日韩欧美一区免费| 大伊人狠狠躁夜夜躁av一区| 亚洲午夜激情网页| 国产精品蜜芽在线观看| 日韩88av| 欧美高清视频免费观看| 一区 二区 三区| 国产成人在线观看免费网站| 91精品国产综合久久久久久漫画| 香港日本三级视频| 亚洲精品视频一二三区| 一道本在线免费视频| 黄色小视频免费网站| 亚洲成人基地| 精品国自产拍在线观看| 日韩一卡二卡在线观看| 中文字幕伦av一区二区邻居| 欧美日韩国产精品专区| 国产一区二区三区无遮挡| 精品欧美不卡一区二区在线观看| 欧美aaaaaaaaaaaa| av软件在线观看| 在线播放av网址| 中文字幕av久久爽一区| 欧美久久在线观看| 香蕉久久国产av一区二区| 欧美一级二级三级区| 99久久精品国产毛片| 成人激情在线观看| 91精品国产一区二区三区动漫| 台湾十八成人网| 久久久资源网| 成人国产精品免费| 国产精品白丝jk黑袜喷水| 精品一区二区在线免费观看| 久久久91精品国产一区二区三区| 精品视频偷偷看在线观看| 91性高潮久久久久久久| 欧美性潮喷xxxxx免费视频看| 欧美日韩国产精品一区二区| 国产剧情一区在线| 国产精品中文久久久久久| 国产网红在线观看| 绯色av蜜臀vs少妇| 欧美韩国日本| 另类视频在线观看| 国产精品无码一区二区桃花视频| 2021中文字幕在线| 蜜臀av在线播放一区二区三区|