`
耳东成陈
  • 浏览: 15351 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ORA-04091 关于在oracle行级触发器中访问本表的错误解决

阅读更多
今天写了个触发器,创建的是行级触发器,
对于oracle行级触发器(for each row),不能对本表做任何操作,包括读取
原则:
在before insert触发器中,可以实现对本表的访问;
在after insert触发器中,不能实现对本表的访问;
在before/after update/delete触发器中,都不能实现对本表的访问

如果插入或修改一条数据时,需要更新另一张表的数据,但是由于在触发器中需要访问触发器本表,一直报ORA-04091错误,如果不使用行级触发器,那么则不能根据 ld.field1 , :NEW.field1访问新旧数据,在网络搜索百般后终于找到实用的解决方法,通过自治事务实现(修改触发器)。
现在将大致的测试场景重现。

原因:在行级触发器中,不能查询自身表
场景重现:通过触发器实现test_count表中统计test表中行数
--创建子表
create table TEST
(id NUMBER, name varchar2(100), primary key (id));
--创建统计表
create table test_count (test_count int);
--创建触发器
CREATE OR REPLACE TRIGGER T_TEST
  AFTER INSERT OR DELETE ON TEST
  FOR EACH ROW
DECLARE
  A NUMBER;
BEGIN
  SELECT  COUNT(*) INTO A FROM TEST;
  UPDATE TEST_COUNT SET TEST_COUNT = A;
END T_TEST;

模拟错误:
INSERT INTO TEST (ID,NAME)VALUES(2,'abc');
ORA-04091: table CHF.TEST is mutating, trigger/function may not see it
ORA-06512: at "CHF.T_TEST", line 2
ORA-04088: error during execution of trigger 'CHF.T_TEST'

处理方法:
通过自治事务实现(修改触发器)
CREATE OR REPLACE TRIGGER T_TEST
  AFTER INSERT OR DELETE ON TEST
  FOR EACH ROW
DECLARE
  A NUMBER;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  SELECT  COUNT(*) INTO A FROM TEST;
  UPDATE TEST_COUNT SET TEST_COUNT = A;
  COMMIT;
END T_TEST;

PRAGMA AUTONOMOUS_TRANSACTION
当前的触发器作为已有事务的子事务运行,子事务自治管理,子事务的commit、rollback操作不影响父事务的状态

解决方法来自 http://www.xifenfei.com/1214.html/comment-page-1 懒得编辑后面照搬过来了,纯属资料学习,别无它用,谢谢。
分享到:
评论

相关推荐

    计算机软件-编程源码-oracle 8i数据库管理员手册.zip

    Oracle 8i数据库管理员手册是一份详尽的指南,涵盖了Oracle数据库系统在8i版本中的管理、配置和优化。这份手册对于任何希望深入了解Oracle数据库管理的IT专业人员来说,都是宝贵的资源。以下是从该手册中可能涉及的...

    oci.dll(版本:oracle 11.2.0.1)

    通过oci.dll,开发者可以访问Oracle数据库的所有特性,包括高级的存储过程、触发器、索引、分区表、物化视图等。 在开发过程中,开发者需要引用oci.dll,并且通常需要配置Oracle客户端环境,包括设置Oracle Home、...

    Oracle数据库笔记-JackChiang.docx

    7. **安全性**:Oracle数据库支持用户权限管理,通过角色和系统权限分配,以及行级和列级的访问控制。审计功能可以帮助记录数据库活动,确保合规性。 8. **高可用性与灾难恢复**:Oracle提供Real Application ...

    oracle OCP 培训教材

    Oracle OCP,全称为Oracle Certified Professional,是Oracle公司为专业人士提供的数据库管理认证,旨在验证其在Oracle数据库领域的专业技能和知识。这个认证是数据库管理员(DBA)、开发人员和其他Oracle技术专家提升...

    oracle笔记

    - **删除Oracle中奇怪的表名称BIN$…的方法**:这类表通常是由于Oracle的回收站功能导致的,可以通过禁用回收站或手动清理回收站中的对象来解决。 #### 十三、扩展课程 **扩展课程内容**: - **SQL语句处理过程**...

    oracle内部培训教程

    14. **故障排查**:学习识别和解决常见的Oracle错误,如ORA-错误代码,以及如何使用日志文件和跟踪文件进行问题诊断。 通过这个全面的Oracle内部培训教程,您将不仅了解Oracle数据库的基础知识,还能深入到高级特性...

    Oracle 9i 简明教程轻松实战20天

    《Oracle 9i 简明教程——轻松实战20天》是一本针对初学者的Oracle数据库管理系统的学习指南。在20天的时间里,通过这本书,读者可以系统地掌握Oracle 9i的基础知识和实践技能。Oracle 9i是Oracle公司推出的一款重要...

    oracle锁讲解笔记

    锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下。Oracle通过锁机制来协调这些并发操作,避免数据...

    oracle DBA宝典和教程.rar

    在Oracle数据库管理中,你需要了解以下几个关键知识点: 1. **数据库安装与配置**:包括Oracle软件的下载、安装、创建数据库实例,以及初始化参数文件(init.ora)的设置。理解Oracle的运行机制,如内存结构(SGA和...

    oracle PPT教程

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级数据存储、管理和处理方面扮演着重要角色。本"Oracle PPT教程"旨在提供全面的Oracle语言基础和实践技巧,帮助学习者掌握Oracle数据库的核心概念及...

    Ora 9i SQL参考手册

    Oracle 9i(第9代)是Oracle数据库的一个重要里程碑,它在性能、可扩展性、可用性和安全性等方面都有显著提升,而SQL作为与数据库交互的核心工具,其在9i中的增强和优化更是关键。 首先,9i SQL引入了并行查询...

    Oracle.v10g-实用培训教程7

    接下来,我们将根据这一信息展开一系列关于Oracle v10g的基础知识点介绍。 ### Oracle v10g简介 Oracle v10g是Oracle公司推出的一款关系型数据库管理系统(RDBMS),其中“g”代表网格(Grid)计算,这是Oracle v10g的...

    oracle10g同步复制实例

    Oracle 10g 同步复制实例是一种在分布式环境中实现数据实时或近实时同步的技术,主要应用于需要在多个地点保持数据一致性的应用系统。在Red Hat Enterprise Linux Server 5.3上运行的Oracle Database 10g Enterprise...

    Oracle9i基础

    4. **数据库对象**:在Oracle中,数据库对象包括表、视图、索引、存储过程、触发器、函数和包等。理解这些对象的创建、修改和删除语法至关重要,它们是数据库应用开发的基础。 5. **数据类型**:Oracle9i支持多种...

    oracle教程

    Oracle教程涵盖了数据库的基础概念、Oracle体系...总的来说,Oracle教程是一个全面的学习路径,从基础理论到实践应用,帮助学习者掌握Oracle数据库的各个关键方面,从而在实际工作中有效管理和利用Oracle数据库系统。

    oracle操作手册

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和稳定性使得它在企业级应用中占据了重要地位。本“Oracle操作手册”旨在为数据库管理员(DBA)和开发人员提供一套全面的操作指南,帮助他们更...

    Oracle 9i 标准教程

    在Oracle 9i中,表、视图、索引、存储过程和触发器等都是基本元素。 二、Oracle 9i安装与配置 Oracle 9i的安装涉及到操作系统兼容性、硬件需求、网络设置等多个方面。你需要熟悉安装过程,包括选择适当的安装类型...

    Oracle官方文档CHM合集-SQL参考手册.rar

    Oracle官方文档CHM合集中的"SQL参考手册"是一份极其重要的资源,它为开发者提供了全面的Oracle SQL语言指南。CHM(Compiled HTML Help)格式是一种由微软开发的帮助文件系统,便于用户离线查看和搜索内容,使得在...

Global site tag (gtag.js) - Google Analytics