有個(gè)空間

          有個(gè)標(biāo)題

          查找物化視圖日志(Materialized view log)

          需求:查找物化視圖日志中的數(shù)據(jù)。
          背景:兩個(gè)數(shù)據(jù)庫(kù),為了同步。在其中一個(gè)數(shù)據(jù)庫(kù)的表上建物化視圖日志,當(dāng)表的數(shù)據(jù)有更新,對(duì)應(yīng)的物化視圖日志就會(huì)有相應(yīng)記錄。詳細(xì)的創(chuàng)建、查詢物化視圖日志的介紹見(jiàn)下文附錄。
          ps: 下文開(kāi)始,物化視圖日志用mvlog 代替。

          首先聲明不知道還沒(méi)有別的辦法,自己想到就是這個(gè)土辦法。
          1 查找到所有mvlog ;
          2 找到所有涉及到的表的主鍵列;
          3 查詢每個(gè)mvlog中的主鍵的值。

          1 查詢所有的mvlog,找到表名和mvlog表名
          1 SELECT MASTER, LOG_TABLE FROM DBA_MVIEW_LOGS WHERE LOG_OWNER = UPPER(?)
          注:這里的參數(shù)和2的OWNER的參數(shù)值是一樣的,都是數(shù)據(jù)庫(kù)用戶名(登錄用的)。


          2 用1查詢到的每個(gè)表名去查詢那個(gè)表的主鍵列。
          1           " SELECT  T2.COLUMN_NAME "
          2             + "        FROM DBA_CONSTRAINTS T1, DBA_IND_COLUMNS T2 "
          3             + "        WHERE T1.TABLE_NAME =UPPER(?) "
          4             + "            AND T2.TABLE_NAME=T1.TABLE_NAME "
          5             + "            AND T1.CONSTRAINT_TYPE='P' "
          6             + "            AND T1.INDEX_NAME = T2.INDEX_NAME "
          7             + "            AND T1.OWNER=UPPER(?) ";
          注:參數(shù)1就是1查詢到的“MASTER”的值。


          3 用1查詢到的每個(gè)mvlog表去查詢2查詢到的每個(gè)主鍵列的值
          1                 " SELECT DISTINCT "
          2                 while () {
          3                      @2@COLUMN_NAME + ","
          4                  }
          5                  " FROM   @1@LOG_TABLE "

          這樣就得到了,每個(gè)mvlog中的主鍵的值。


          附錄:1創(chuàng)建mvlog
          1 create materialized view log on marea with primary key,rowid,
          sequence (AREA_NM_R, AREA_NM_N) including 
          new values;
          primary key是主鍵,rowid是表更新涉及的行號(hào),sequence是序列對(duì),自由添加。

                  2查詢mvlog
          查詢mvlog和查詢表是一樣的,簡(jiǎn)單的查詢語(yǔ)句就可以。
          1 select * from mlog$_marea

          關(guān)于mvlog 的介紹目前只接觸到這些,To be continued...
          文中及到的DBA_MVIEW_LOGS,DBA_CONSTRAINTS,DBA_IND_COLUMNS 也有必要介紹下,不過(guò)看字面意思還是能望而生義的...

          ------------------------------我是分割線----------------------------------

          因?yàn)閷?duì)DBA表不甚了解,項(xiàng)目開(kāi)發(fā)的時(shí)候果然出了點(diǎn)問(wèn)題。

          客戶后來(lái)要求不要用DBA的表,改用USER表。因?yàn)榭紤]到商用環(huán)境,用戶一般不會(huì)給予DBA權(quán)限。

          所以兩段SQL文稍有修改:


          1 查詢所有的mvlog,找到表名和mvlog表名

          1  SELECT MASTER, LOG_TABLE FROM USER_MVIEW_LOGS

          2 用1查詢到的每個(gè)表名去查詢那個(gè)表的主鍵列。

          1            " SELECT  T2.COLUMN_NAME  "
          2               +   "         FROM USER_CONSTRAINTS T1, USER_IND_COLUMNS T2   "
          3               +   "         WHERE T1.TABLE_NAME =UPPER(?)  "
          4               +   "             AND T2.TABLE_NAME=T1.TABLE_NAME  "
          5               +   "             AND T1.CONSTRAINT_TYPE='P'  "
          6               +   "             AND T1.INDEX_NAME = T2.INDEX_NAME  " ;

          注:主要就是將DBA表->USER表,并把OWNER和LOG_OWNER的限制去掉了,因?yàn)閁SER表對(duì)應(yīng)的肯定是用戶本身,也就沒(méi)有必要限制了。



          posted on 2009-06-15 17:24 游雯 閱讀(10330) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java編程技巧


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武山县| 峨边| 吴忠市| 延庆县| 娱乐| 临泽县| 黔南| 元氏县| 额尔古纳市| 大悟县| 宜章县| 泸水县| 荥经县| 徐闻县| 禹城市| 龙井市| 泰州市| 邢台县| 余姚市| 本溪| 若羌县| 乌兰县| 淄博市| 乐东| 合山市| 开封县| 若羌县| 东乡县| 灵台县| 凌海市| 上蔡县| 柳河县| 潮州市| 台南县| 宁德市| 蒙阴县| 兴安县| 防城港市| 嘉义市| 都兰县| 汉沽区|