ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PLSQL方式更新LOB不会被触发器捕获

PLSQL方式更新LOB不会被触发器捕获

原创 Linux操作系统 作者:yangtingkun 时间:2010-06-28 23:54:49 0 删除 编辑

通过触发器是没有办法捕获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博客 ” ,链接:https://blog.itpub.net/4227/viewspace-666540/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 规则——流
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077260