PLSQL方式更新LOB不會被觸發器捕獲

yangtingkun發表於2010-06-28

透過觸發器是沒有辦法捕獲PL/SQL透過DBMS_LOB包對LOB的修改,不過透過物化檢視日誌可以捕獲這個操作。

 

 

看一個簡單的例子:

SQL> CREATE TABLE T (ID NUMBER, CONTENTS CLOB);

表已建立。

SQL> ALTER TABLE T ADD PRIMARY KEY (ID);

表已更改。

SQL> INSERT INTO T VALUES (1, 'ABCD');

已建立 1 行。

SQL> INSERT INTO T VALUES (2, 'EFG');

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

實體化檢視日誌已建立。

SQL> CREATE TABLE T_LOG (ID NUMBER);

表已建立。

SQL> CREATE TRIGGER T
  2  BEFORE UPDATE ON T
  3  FOR EACH ROW
  4  BEGIN
  5  INSERT INTO T_LOG VALUES (:NEW.ID);
  6  END;
  7  /

觸發器已建立

SQL> UPDATE T    
  2  SET CONTENTS = 'ABCDEFG'
  3  WHERE ID = 1;

已更新 1 行。

SQL> SELECT * FROM T_LOG;

        ID
----------
         1

SQL> SELECT ID FROM MLOG$_T;

        ID
----------
         1

SQL> DECLARE
  2     V_RESULT CLOB;
  3  BEGIN
  4     SELECT CONTENTS
  5     INTO V_RESULT
  6     FROM T
  7     WHERE ID = 2
  8     FOR UPDATE;
  9     DBMS_LOB.WRITEAPPEND(V_RESULT, 5, '12345');
 10     COMMIT;
 11  END;
 12  /

PL/SQL 過程已成功完成。

SQL> SELECT * FROM T_LOG;

        ID
----------
         1

SQL> SELECT ID FROM MLOG$_T;

        ID
----------
         1
         2

可以看到,對於SQL方式更新LOB操作,可以被觸發器捕獲,但是透過PL/SQL呼叫DBMS_LOB包對LOB進行的寫操作,不會被觸發器捕獲。

而物化檢視日誌會則記錄所有的操作。本以為10g中,物化檢視日誌不會再記錄PL/SQL方式的LOB修改,才使得10g的物化檢視重新整理的時候不在考慮LOB的因素,沒想到物化檢視日誌仍然是記錄LOB修改的,想不通Oracle為什麼以及實現的功能反而去掉了。

包含LOB的物化檢視快速重新整理:http://yangtingkun.itpub.net/post/468/493060

包含LOB的物化檢視快速重新整理(二):http://yangtingkun.itpub.net/post/468/493206

包含LOB的物化檢視快速重新整理(三):http://yangtingkun.itpub.net/post/468/493660

包含LOB的物化檢視快速重新整理(四):http://yangtingkun.itpub.net/post/468/493970

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-666540/,如需轉載,請註明出處,否則將追究法律責任。

相關文章