`
shylhd
  • 浏览: 74155 次
  • 性别: Icon_minigender_2
  • 来自: 河北
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用视图行级触发器解决ORA-04091不能读当前表

阅读更多

相信写过ORACLE行级触发器的IT同仁们大多遇到过ORA-04091问题,即在某表的行级触发器中不能读取当前表的问题,如:

create table test(id raw(16), name varchar2(100), primary key (id));
create table test_count(test_count int);
insert into test_count values(0);
commit;
create or replace trigger t_test
    AFTER INSERT OR DELETE ON test
    FOR EACH ROW
BEGIN
        UPDATE test_count
        SET test_count = (SELECT count(*) from test);
END t_test;
/

当您在插入test表时,系统会抱怨(当然计数这样的简单业务是不需要使用触发器来做的,仅用于举例):

第 1 行出现错误:
RA-04091: 表 TEST.TEST 发生了变化, 触发器/函数不能读它
RA-06512: 在 "TEST.T_TEST", line 2
RA-04088: 触发器 'TEST.T_TEST' 执行过程中出错

前几天看到触发器的INSTEAD OF子句,顺便用它搞定:

drop trigger t_test;
create view v_test as select id, name from test;
create or replace trigger t_v_test
  INSTEAD OF INSERT OR DELETE OR UPDATE ON v_test
  FOR EACH ROW
DECLARE
BEGIN
    IF inserting THEN
        INSERT INTO test(id, name) values(:new.id, :new.name);
    END IF;
    IF deleting THEN
        DELETE FROM test WHERE id = :old.id;
    END IF;
    IF updating THEN
        UPDATE test
        SET id = :new.id, name = :new.name
        WHERE id = :old.id;
    ELSE
        UPDATE test_count
        SET test_count = (SELECT count(*) from test);
    END IF;
END t_v_test;
/

原来对test表的插入改为对v_test插入,一切OK,搞定。

分享到:
评论

相关推荐

    行级触发器不能读.txt

    行级触发器不能读.txt

    Oracle触发器修改自身表

    1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...

    实验六-触发器实验报告.doc

    行级触发器中的谓词 在一个多条件触发的触发器中,使用谓词可以区分当前触发的操作的类型:inserting, updating,deleting。 示例: IF Inserting THEN 语句 ; END IF; IF Updating THEN 语句 ; END IF; IF Deleting...

    实验4答案-触发器.sql

    3、创建一个instead of行级触发器,为贷款表(LoanT)定义完整性规则“贷款日期(Ldata)不能早于当前日期,如果早于,自动改为当前日期”。 4、创建一个DELETE触发器,当贷款表(LoanT)中的记录被删除时,将删除的...

    Oraclet中的触发器

    2 替代触发器:由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。 3系统触发器:ORACLE 8i 提供了第三种类型的触发器叫...

    数据库-触发器

    简要介绍触发器,触发器的种类,定义,使用方法。

    触发器的建立使用

    发器是一种特殊的存储过程,它在执行语言事件执行时自动生效。

    实验二十五触发器

    网络数据库的触发器章节。又不太懂的同学可以下载下来研究下。

    trigger触发器trigger触发器trigger触发器

    --行级触发器 create or replace trigger insert_person after insert on person for each row begin insert into person2 values(:new.id,:new.name,:new.password); end; create or replace trigger update_...

    触发器的总结

    描述了如何创建触发器,包括触发器的组成,触发条件,触发时机。

    oracle触发器使用,很详细

    触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,...

    oracle 触发器方式实现行ID自增加

    oracle 触发器方式实现行ID自增加介绍的很详细! 大家好好学习啊

    第9章_触发器.ppt

    1、了解触发器的类型及各种触发器的功能。 2、掌握各类触发器的创建方法及执行流程。 3、熟悉触发器谓词的使用。 4、重点掌握行级触发器的创建和标识符的使用 方法。

    oracle触发器详解

    oracle触发器详解,对初步学习数据库的人有很大的帮助

    oracle 触发器

    在一个表上同时定义语句级触发器和行级触发器验证先触发那种触发器的验证sql代码

    Oracle触发器用法实例详解

    因此触发器不需要人为的去调用,也不能调用。然后,触发器的触发条件其实在你定义的时候就已经设定好了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是...

    oracle常见的锁查询和处理

    行级锁(TX锁) 表级锁(TM锁) 锁定相关视图 v$transaction v$lock 5 v$enqueue_lock v$session 检测并解决冲突 常见的锁查询和处理 当前系统中存在的锁争用: 引发争用的session信息: 引发争用的sql语句: 引发...

    16.Oracle触发器1

    1、语句触发器DML操作(insert、delete、update),不管SQL语句影响的记录是多少行,触发器只触发一次 2、行级触发器DML操作(insert

    关于采用Oralce行级安全策略解决应用系统数据权限的论述

    我们在开发应用系统时,经常遇到这样的问题:用户只被允许访问某张表的一部分数据,而且无论使用哪个界面,都只能访问这一部分数据。比如,用户A只能访问装货港是上海的委托。通常我们会在SQL语句中加入条件来过滤...

    行级锁的实例

    行级锁的实例

Global site tag (gtag.js) - Google Analytics