有個空間

          有個標題

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

          需求:查找物化視圖日志中的數據。
          背景:兩個數據庫,為了同步。在其中一個數據庫的表上建物化視圖日志,當表的數據有更新,對應的物化視圖日志就會有相應記錄。詳細的創建、查詢物化視圖日志的介紹見下文附錄。
          ps: 下文開始,物化視圖日志用mvlog 代替。

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

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


          2 用1查詢到的每個表名去查詢那個表的主鍵列。
          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(?) ";
          注:參數1就是1查詢到的“MASTER”的值。


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

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


          附錄:1創建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是表更新涉及的行號,sequence是序列對,自由添加。

                  2查詢mvlog
          查詢mvlog和查詢表是一樣的,簡單的查詢語句就可以。
          1 select * from mlog$_marea

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

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

          因為對DBA表不甚了解,項目開發的時候果然出了點問題。

          客戶后來要求不要用DBA的表,改用USER表。因為考慮到商用環境,用戶一般不會給予DBA權限。

          所以兩段SQL文稍有修改:


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

          1  SELECT MASTER, LOG_TABLE FROM USER_MVIEW_LOGS

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

          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的限制去掉了,因為USER表對應的肯定是用戶本身,也就沒有必要限制了。



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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 随州市| 进贤县| 迭部县| 莒南县| 祁阳县| 东阳市| 昌吉市| 顺昌县| 鹿邑县| 革吉县| 乌拉特中旗| 宁城县| 枣庄市| 富蕴县| 禄劝| 榆树市| 建宁县| 遂川县| 米易县| 桂林市| 浦北县| 临邑县| 建平县| 娱乐| 华坪县| 云安县| 化德县| 民丰县| 开远市| 全南县| 乐至县| 长乐市| 乐都县| 衢州市| 夏邑县| 弥渡县| 公主岭市| 沁阳市| 阿巴嘎旗| 贞丰县| 台北市|